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工作,所以会引起一个异常。这段不可见代码是我反汇编后观察汇编源码才得知的。