3

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

type
 IUtility = interface(IDispatch);

var
  obj: IUtility;

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


  // doesnot work
  VariantClear(obj);
end;
4

1 回答 1

6

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

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

由于它是自动发生的,因此您无需自己做任何事情。然而,如果你想在作用域自然结束之前放弃对接口对象的控制,你可以简单地通过赋值来清除变量nil

obj := nil;

您的obj变量不是 type Variant,这就是为什么调用它是错误的VariantClear

于 2013-06-29T17:15:08.870 回答