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
います。