私は、OleVariantにカプセル化されたインターフェイスを解放するための安全で決定論的な方法を見つけようとしています。OleVariantの背後にあるインタフェースを解放する正しい方法は何ですか?
AFAICS Delphiはプロシージャの終了時にインターフェイス参照を解放しますが、私の場合、COMをシャットダウンする必要があるため、前もって実行する必要があります。私はCoUninitialize
を呼び出す前に、私は解放することができ、余分なクラスのインスタンスでOleVariantを置くものの
procedure Test;
var
LLibrary: OleVariant;
begin
CoInitialize(nil);
try
LLibrary := Null;
try
LLibrary := CreateOleObject(LibraryName);
finally
LLibrary := Unassigned; // <-- I would like to release the interface here
end;
finally
CoUninitialize; // <-- Shutdown of COM
end;
end; // <-- The compiler releases the interface here
私は。
procedure Test;
var
Container: TLibraryContainer; // Holds the OleVariant
begin
CoInitialize(nil);
try
Container := TLibraryContainer.Create;
try
{...}
finally
Container.Free;
end;
finally
CoUninitialize;
end;
end;
このソリューションは安全ですか、見落とした方が良いソリューションがありますか?
実際のオプションは、関数呼び出しをカウントし、生成されたアセンブラコードを検査して隠れたローカル変数がないことを確認しない限り、セカンダリルーチンを使用する唯一のオプションです。あなたの 'DoWork'ルーチンを呼び出すための+1 ...' DoWork'、詳細については私の削除された答えを見てください。 –
@コスミン私は第2の選択肢が優れていることに同意します。 –
実際には、私の実際のコードはもう少し洗練されています。私はあなたの最初の変種を使わなければならないと思いますが、私は2番目のコードを使用できるようにコードをリファクタリングしようとします。 :) –