我需要在Delphi中免费使用IDispatch吗?

时间:2013-06-29 16:58:57

标签: delphi com variant

如何在Delphi中释放IDispatch COM对象?我需要吗?

type
 IUtility = interface(IDispatch);

var
  obj: IUtility;

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


  // doesnot work
  VariantClear(obj);
end;

1 个答案:

答案 0 :(得分:5)

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

Delphi会在适当的时间自动插入代码以在接口上调用_AddRef_Release,包括变量超出范围时。因此,在函数结束时,obj将超出范围,编译器将自动插入代码,基本上执行if not Assigned(obj) then obj._Release

由于它自动发生,您不需要自己做任何事情。但是,如果要在范围的自然结束之前放弃对接口对象的控制,则可以通过分配nil来清除变量。

obj := nil;

您的obj变量不属于Variant类型,这就是为什么在其上调用VariantClear是错误的。