首页  编辑  

IUnknown类型的局部变量由谁负责Release

Tags: /超级猛料/COM、ActiveX,DDE/   Date Created:
IUnknown类型的局部变量由谁负责Release
  在C++中,IUnknown是一个抽象类,它拥有三个方法:QueryInterface、AddRef和Release,而在Delphi中,这三个方法分别是QueryInterface、_AddRef和_Release,注意方法名前页的下划线。
  编制使用IUnknown类局部变量的程序时应注意,Delphi在一个模块结束之前将会自动调用_Release方法来释放所有的IUnknown局部变量,而这些代码对于程序员来说是不可见的。看下面的代码:
function TestProc:HRESULT;
var
lpDD:IDirectDraw;
begin
Result:=DirectDrawCreate(nil,lpDD,nil);
if Result<>0 then
 raise Exception.Create('Failed create!');
Result:=lpDD.QueryInterface(IID_IDirectDraw2, MyDirectDraw);
lpDD._Release; // 这一行代码是多余的,将导致出错
end;
  上面的一段函数建立一个IDirectDraw2类(MyDirectDraw是一个IDirectDraw2类型的全局变量),其中最后一行的lpDD._Release是错误的,在C++中需要这么做,但在Delphi里因为有一段不可见的代码自动完成对lpDD的Release工作,所以会引起一个异常。这段不可见代码是我反汇编后观察汇编源码才得知的。