デルファイのレイトビンディングで作業するための適切な方法はどれですか?
-
09-10-2019 - |
質問
実際、私はDelphiで遅延拘束を使用していますが、Wichが適切な作業方法であることを知る必要があります。
私の主な懸念は、これらのオブジェクトで使用されるメモリをどのように処理するかについてです。メモリを解放する必要がありますか?
このサンプルコードを確認してください
var
chEaten: Integer;
BindCtx: IBindCtx;
Moniker: IMoniker;
MyObject:: IDispatch;
begin
try
OleCheck(CreateBindCtx(0, bindCtx));
OleCheck(MkParseDisplayName(BindCtx, StringToOleStr('oleobject.class'), chEaten, Moniker));
OleCheck(Moniker.BindToObject(BindCtx, nil, IDispatch, MyObject));
MyObject.Metod1();
MyObject.Metod2();
finally
MyObject:=nil,// is this necesary?
end;
end;
誰かがこのタイプのオブジェクトのメモリをどのように処理するかを簡単に説明した場合に役立ちます。
前もって感謝します。
解決
Delphiのcomインターフェイスオブジェクトは、コンパイラによって自動的に管理されます。隠された呼び出しを挿入します AddRef
と Release
適切な場所で、そしてあなたのインターフェイスは自動的にそれらを持っています Release
それらが範囲外に出たときに呼び出される方法。いいえ、あなたはそうする必要はありません nil 参照。
他のヒント
メイソンが言ったように、インターフェイスのメモリはコンパイラによって管理されています。ただし、StringToolestr()は、SysFreestring()で手動で解放する必要がある割り当てられたBSTRを返します。代わりに、幅が広いタイプを使用する必要があります。これは、メモリを管理します。
OleCheck(MkParseDisplayName(BindCtx, PWideChar(WideString('oleobject.class')), chEaten, Moniker));
または:
var
w: WideString;
w := 'oleobject.class';
OleCheck(MkParseDisplayName(BindCtx, PWideChar(w), chEaten, Moniker));
所属していません StackOverflow