3

DelphiでIDispatch COMオブジェクトを解放するには? やらなくてはいけませんか?

type
 IUtility = interface(IDispatch);

var
  obj: IUtility;

begin
  obj := CreateOleObject("Utility") as IUtility;


  // doesnot work
  VariantClear(obj);
end;
4

1 に答える 1

6

IDispatch他のすべてのインターフェースと同様です。それを実装するオブジェクトは、その参照カウントがゼロに達すると、それ自体を破棄します。

Delphiは、変数がスコープ外になったときなど、適切なタイミングで呼び出しコード_AddRefとインターフェイス上にコードを自動的に挿入します。_Releaseしたがって、関数の最後で、objはスコープ外になり、コンパイラは自動的にコードを挿入して本質的に do を実行しますif not Assigned(obj) then obj._Release

自動的に行われるため、自分で何もする必要はありません。ただし、スコープの自然な終了よりも前にインターフェース化されたオブジェクトの制御を放棄したい場合は、を割り当てることで変数を単純にクリアできますnil

obj := nil;

あなたのobj変数は typeVariantではないため、それを呼び出すのは間違ってVariantClearいます。

于 2013-06-29T17:15:08.870 に答える