2011-12-07 59 views
9

DelphiのAPPとDelphi DLLの間でstringsを共有すると、use節の最初の単位としてSharememをappとdllプロジェクトの両方のソースに追加する必要があります。DelphiのSharemem - 必要がない場合

しかし、Pcharsしか受け入れないdllメソッドの一部で、私はstringsを使用するdllメソッドの中にsharememも使用する必要がありますか?私は、サンプルコードを示しましょう:そのシンプルで役に立たない場合

procedure ShowMyCustomMessage(aMessage : Pchar); 
var 
    vUselessString : string; 
begin 
    vUselessString := aMessage; 
    ShowMessage(vUselessString); 
end; 

exports 
    ShowMyCustomMessage; 

を、dllがPcharを受け入れているが、エクスポートされたメソッド内でdllがstring VARを作成します。 ShareMemも追加する必要がありますか?

WideStringについてWideStringのパラメータを渡すにはSharememを使用する必要がありますか?

+2

廃止予定のborlndmm.dllメモリマネージャを使用する場合は、AFAIK 'ShareMem'を使用します。しかし、Delphi 2007以降、これは良いアイデアではありません.FastMM4に基づいたSimpleShareMemのほうがずっと高速です。 –

+0

@Arnaud borlndmmは廃止されましたか?私は誰もそれについて話しているのを見たことがありません。 –

+0

@RafaelColucci:*古い* borlndmm.dll。紛らわしく、すべてのメモリマネージャDLLにはこの名前が付いています。現在のバージョンのDelphi/C++ Builderは、 'borlndmm.dll'にコンパイルされたFastMMを使用しており、現在では数年間使用されています。 –

答えて

17

メモリが1つのモジュール(つまりDLL/EXE)に割り当てられ、別のモジュールで割り当てが解除されている場合に限り、Sharememを使用する必要があります。これは、モジュール間でstringを渡して作業しているときによく発生します。

あなたが与えた例では、Sharememを使う必要はありません。 PCharのメモリは、呼び出される側によって割り当てられ、呼び出し先によって割り当て解除されません。呼び出し先の文字列は呼び出し先に割り当てられ、割り当て解除されます。ここで

function GetString: string; 
begin 
    Result := 'hello'; 
end; 

文字列のメモリが呼び出し先に割り当てられているが、呼び出し側によって割り当て解除されます。

は、ここでは、Sharememを必要とする例を示します。

WideStringのケースは非常に特殊です。 WideStringはCOM BSTRタイプのラッパーです。共有COMアロケータを使用して割り当ておよび割り当てを解除します。したがって、それはDelphiアロケータを使用せず、Sharememを使用せずにモジュール間でWideStringを渡すことは安全です。

+0

知っておきたいのですが、Pcharの代わりにdllがワイルストリングを受け入れるならばどうでしょうか? –

+0

回答が更新されました。あなたの質問にはWideStringは言及していませんでした! –

+0

私は知っている、それはちょうどプラスでした。すべてに感謝します。 –

関連する問題