デルファイのレイトビンディングで作業するための適切な方法はどれですか?

StackOverflow https://stackoverflow.com/questions/3983526

質問

実際、私は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インターフェイスオブジェクトは、コンパイラによって自動的に管理されます。隠された呼び出しを挿入します AddRefRelease 適切な場所で、そしてあなたのインターフェイスは自動的にそれらを持っています 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)); 
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top