0

そのため、dll 内の文字列を割り当てて破棄する必要があるホスト Delphi 7 アプリケーションがあります。確かにdllもオブジェクトPascalで書かれていて、とりあえず使ってそのフォルダにずっとShareMem持ち歩いています。Borlndmm.dll

現在、この dll を C で書き直して (mingw が望ましい)、Delphi 7 で書かれたメイン アプリケーション用に dll をコンパイルする必要があります。

それはどのように達成できますか?borland メモリ マネージャを C で書き直す必要がありますか、それとも使用するインターフェイスを書く必要がありますborlndmm.dllか?

4

1 に答える 1

2

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 ランタイムを十分にエミュレートする方法を考案して、文字列と相互運用できるようにすることは確かに可能です。しかし、それは悪い考えだと思います。代わりに、標準の相互運用慣行に従う必要があります。

  1. メモリを割り当てたモジュールと同じモジュールでメモリの割り当てを解除するようにします。
  2. 2 つのモジュール間で標準の相互運用型のみを渡します。つまり、整数型、浮動小数点型、ヌル終了文字列ポインターです。また、標準の相互運用型のみを含む複合型、レコード、および配列。

アップデート

コメントで次のように述べています。

問題は、Delphi アプリのソースコードがないことです。

それはあなたを縛り付けたままにします。DLL へのインターフェイスを変更することはできません。解決策は、Delphi 7 で記述されたシン ラッパー DLL を作成することです。そのラッパー DLL はSharemem、ホスト実行可能ファイルによって破棄される文字列を使用し、作成することができます。ラッパー DLL は、ホスト実行可能ファイルからのすべての要求を新しい C DLL に転送します。Delphi 7 ラッパーと新しい C DLL 間の相互運用性は、標準の相互運用性ガイドラインに従います。

ラッパー DLL は、アダプタと呼ばれるものです。

于 2013-04-18T17:22:36.010 に答える