我需要释放Delphi中的IDispatch吗?

3
如何在Delphi中释放IDispatch COM对象?我需要这么做吗?
type
 IUtility = interface(IDispatch);

var
  obj: IUtility;

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


  // doesnot work
  VariantClear(obj);
end;
1个回答

6

IDispatch 就像其他所有接口一样。当实现它的对象看到自己的引用计数降为零时,它将销毁自身。

Delphi 会在适当的时候自动插入代码来调用接口的 _AddRef_Release,包括变量超出作用域时。因此,在函数结尾处,obj 会超出作用域,编译器会自动插入代码以实现 if not Assigned(obj) then obj._Release

由于这是自动发生的,您不需要自己做任何事情。但是,如果您想提前放弃对接口对象的控制权,您可以通过赋值 nil 来简单地清除变量。

obj := nil;

您的 obj 变量不是 Variant 类型,因此在其上调用 VariantClear 是错误的。


请注意,OleCtrls单元中存在一个内存泄漏错误,涉及返回IDispatch对象成员:http://qc.embarcadero.com/wc/qcmain.aspx?d=106829和http://marc.durdin.net/2012/07/understanding-and-correcting-interface.html - whosrdaddy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接