Mic*_*ick 3 delphi idispatch queryinterface iunknown delphi-xe2
我们正在使用一些旧代码(由Binh Ly创建的ComLib.pas),因此我们可以在(OleVariant)对象上使用枚举接口:
type
TDispNewEnum = dispinterface
['{97079E31-6957-11D2-9154-0000B4552A26}'] // dummy
property _NewEnum: IUnknown readonly dispid -4; // DISPID_NEWENUM
function _NewEnumFunc: IUnknown; dispid -4; // DISPID_NEWENUM
end;
procedure TEnumVariant.AttachUnknown (const Unk: IUnknown);
var
pDisp: IDispatch;
_NewEnumPropFailed: boolean;
Unknown: IUnknown;
begin
Detach;
Unknown := Unk;
{ extract IEnumVariant }
if (Unknown <> nil) then
begin
{ try IEnumVariant }
if not (Succeeded (Unknown.QueryInterface (IEnumVariant, FEnumVariant))) then
begin
FEnumVariant := nil; // safety!
{ test _NewEnum prop and _NewEnum func }
if (Succeeded (Unknown.QueryInterface (IDispatch, pDisp))) then
begin
_NewEnumPropFailed := False;
try
//property _NewEnum
Unknown:=TDispNewEnum(pDisp)._NewEnum; // <---- RAISES EXCEPTION -----
if not (Succeeded(Unknown.QueryInterface(IEnumVariant, FEnumVariant))) then
FEnumVariant := nil; // safety!
except
_NewEnumPropFailed := True;
end; { except }
Run Code Online (Sandbox Code Playgroud)
此代码适用于Delphi 2010和2007,但不适用于XE2.在上面标记的行上(注释"RAISES EXCEPTION"),我们得到一个例外:
项目x.exe引发了异常类$ C0000005,消息"0xbaadf00d访问冲突:读取地址0xbaadf00d".
传入的对象确实具有TDispNewEnum接口,因此不应引发任何异常(与Delphi 2010和2007的情况一样).
建议?谢谢.
该0xbaadf00d内存地址是一个伪内存地址,意为"坏菜"(看六字符).当您要求无效的接口或调用时,通常由代码使用.
如果将行更改为:
pDisp: TDispNewEnum;
...
if (Succeeded (Unknown.QueryInterface (IDispatch, pDisp))) then
begin
_NewEnumPropFailed := False;
try
//property _NewEnum
Unknown:= pDisp._NewEnum;
...
Run Code Online (Sandbox Code Playgroud)
这对我来说更有意义.
我注意到 XE2接口绑定中有一些未记录的更改.也许以前使用强制类型转换(TDispNewEnum(pDisp))的代码不再起作用了.