gpt4 book ai didi

delphi - 释放 OleVariant 后面的接口(interface)的正确方法是什么?

转载 作者:行者123 更新时间:2023-12-03 14:47:40 26 4
gpt4 key购买 nike

我正在尝试找到一种安全/确定的方法来释放封装在 OleVariant 中的接口(interface)。

AFAICS Delphi 在程序结束时释放接口(interface)引用,但就我而言,我必须更早执行此操作,因为我必须关闭 COM。

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

我想将 OleVariant 放入一个额外的类实例中,在调用 CoUninitialize 之前可以释放该实例。

procedure Test;
var
Container: TLibraryContainer; // Holds the OleVariant
begin
CoInitialize(nil);
try
Container := TLibraryContainer.Create;
try
{...}
finally
Container.Free;
end;
finally
CoUninitialize;
end;
end;

这个解决方案安全吗?还是有我忽略的更好的解决方案?

最佳答案

编译器显然使用隐式本地接口(interface)变量作为 CreateOleObject 的返回值。然后在例程结束时释放它,对你来说太晚了。

有几种方法可以解决这个问题。首先,您可以明确由 CreateOleObject 返回的 IDispatch 接口(interface)引用。这使您可以控制其生命周期。

procedure Test;
var
intf: IDispatch;
LLibrary: OleVariant;
begin
CoInitialize(nil);
try
intf := CreateOleObject(LibraryName);
try
LLibrary := intf;
finally
VarClear(LLibrary);
intf := nil;
end;
finally
CoUninitialize;
end;
end;

另一种方法是将调用 CreateOleObject 的代码移至具有自己作用域的单独例程中。

procedure DoWork;
var
LLibrary: OleVariant;
begin
LLibrary := CreateOleObject(LibraryName);
//do stuff with LLibrary
end;

procedure Test;
begin
CoInitialize(nil);
try
DoWork;
finally
CoUninitialize;
end;
end;

由于隐式本地引用位于 DoWork 范围内,因此它会在 DoWork 结束时释放,因此在运行 CoUninitialize 之前释放。

我的建议是使用第二个选项,它更干净,并强制编译器代表您完成工作。

关于delphi - 释放 OleVariant 后面的接口(interface)的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6745769/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com