我們使用(由平Ly的創建ComLib.pas)一些舊的代碼,所以我們可以用枚舉接口的(OleVariant)對象:訪問衝突XE2鑄造的IDispatch
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 }
此代碼工作在德爾福2010年和2007年,但不是與XE2。在上面標註(與評論「產生異常」)的線,我們得到一個異常:x.exe「:讀地址0xbaadf00d在0xbaadf00d訪問 違反」引發的異常類$ 0000005與消息
項目。
傳入的對象確實有TDispNewEnum接口,因此不應引發異常(例如Delphi 2010和2007)。
對此提出建議?謝謝。
請參閱http://stackoverflow.com/questions/7886116瞭解根本原因可能的問題。看起來像一個迴歸。 –