gpt4 book ai didi

delphi - 在 XE2 中类型转换 IDispatch 时出现访问冲突

转载 作者:行者123 更新时间:2023-12-03 15:50:57 25 4
gpt4 key购买 nike

我们正在使用一些旧代码(由 Binh Ly 创建的 ComLib.pas),因此我们可以在 (OleVariant) 对象上使用枚举接口(interface):

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 }

此代码适用于 Delphi 2010 和 2007,但不适用于 XE2。在上面标记的行(带有注释“RAISES EXCEPTION”),我们得到一个异常:

Project x.exe raised exception class $C0000005 with message 'access violation at 0xbaadf00d: read of address 0xbaadf00d'.

传入的对象确实具有 TDispNewEnum 接口(interface),因此不应引发异常(Delphi 2010 和 2007 的情况就是如此)。

建议?谢谢。

最佳答案

0xbaadf00d 内存地址是一个伪内存地址,意思是“BAD FOOD”(查看十六进制字符)。当您请求无效的接口(interface)或调用时,代码通常会使用它。

如果将行更改为:

pDisp: TDispNewEnum;
...
if (Succeeded (Unknown.QueryInterface (IDispatch, pDisp))) then
begin
_NewEnumPropFailed := False;
try
//property _NewEnum
Unknown:= pDisp._NewEnum;
...

这对我来说更有意义。

我已经noticed XE2 接口(interface)绑定(bind)中的一些未记录的更改。也许之前带有强制类型转换的代码 (TDispNewEnum(pDisp)) 因此不再起作用。

关于delphi - 在 XE2 中类型转换 IDispatch 时出现访问冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7874995/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com