DelphiでIDispatch COMオブジェクトを解放するには? やらなくてはいけませんか?
type
IUtility = interface(IDispatch);
var
obj: IUtility;
begin
obj := CreateOleObject("Utility") as IUtility;
// doesnot work
VariantClear(obj);
end;
IDispatch他のすべてのインターフェースと同様です。それを実装するオブジェクトは、その参照カウントがゼロに達すると、それ自体を破棄します。
Delphiは、変数がスコープ外になったときなど、適切なタイミングで呼び出しコード_AddRefとインターフェイス上にコードを自動的に挿入します。_Releaseしたがって、関数の最後で、objはスコープ外になり、コンパイラは自動的にコードを挿入して本質的に do を実行しますif not Assigned(obj) then obj._Release。
自動的に行われるため、自分で何もする必要はありません。ただし、スコープの自然な終了よりも前にインターフェース化されたオブジェクトの制御を放棄したい場合は、を割り当てることで変数を単純にクリアできますnil。
obj := nil;
あなたのobj変数は typeVariantではないため、それを呼び出すのは間違ってVariantClearいます。