Sharemem
あるモジュールで Delphi ヒープを使用して割り当て、別のモジュールで同じヒープを使用して割り当てを解除する場合に使用する必要があります。このSharemem
ユニットは、両方のモジュールのメモリ割り当てが同じアロケータを共有することを保証します。
現在、実行可能ファイルと Delphi DLL の両方が同じバージョンの Delphi でコンパイルされていれば、Delphi 実行可能ファイルと Delphi DLL を使用してこれを行うことができます。しかし、Delphi 実行可能ファイルと C DLL では、それを行うことはまったくできません。Delphi でメモリを割り当てることはできず、C DLL がメモリの割り当てを解除できるとは期待できません。C ランタイムは、共有メモリ マネージャーへの呼び出しに malloc/free をマップしません。
あなたの質問は、Delphi で Delphi 文字列を割り当て、それを C DLL に渡したいということを明確にしています。そして、その C DLL で解放します。まあ、あなたはそれをすることを合理的に期待することはできません. Delphi 文字列は、Delphi ランタイムで管理する必要があります。C DLL でそれを利用することはできません。
さて、C で Delphi ランタイムを十分にエミュレートする方法を考案して、文字列と相互運用できるようにすることは確かに可能です。しかし、それは悪い考えだと思います。代わりに、標準の相互運用慣行に従う必要があります。
- メモリを割り当てたモジュールと同じモジュールでメモリの割り当てを解除するようにします。
- 2 つのモジュール間で標準の相互運用型のみを渡します。つまり、整数型、浮動小数点型、ヌル終了文字列ポインターです。また、標準の相互運用型のみを含む複合型、レコード、および配列。
アップデート
コメントで次のように述べています。
問題は、Delphi アプリのソースコードがないことです。
それはあなたを縛り付けたままにします。DLL へのインターフェイスを変更することはできません。解決策は、Delphi 7 で記述されたシン ラッパー DLL を作成することです。そのラッパー DLL はSharemem
、ホスト実行可能ファイルによって破棄される文字列を使用し、作成することができます。ラッパー DLL は、ホスト実行可能ファイルからのすべての要求を新しい C DLL に転送します。Delphi 7 ラッパーと新しい C DLL 間の相互運用性は、標準の相互運用性ガイドラインに従います。
ラッパー DLL は、アダプタと呼ばれるものです。