2011-10-24 40 views
3

我們使用(由平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)。

對此提出建議?謝謝。

+0

請參閱http://stackoverflow.com/questions/7886116瞭解根本原因可能的問題。看起來像一個迴歸。 –

回答

5

0xbaadf00d內存地址是一個僞存儲器地址,意思是「壞食物」(看看hexa chars)。當您詢問無效的接口或呼叫時,這通常由代碼使用。

如果您更改行成:

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

這使得更好了意義。

我有noticed XE2接口綁定中的一些未公開的更改。也許以前的代碼強制類型轉換(TDispNewEnum(pDisp))由於這個原因而不再工作。

+0

我已經使用「FEnumVariant:= IUnknown(UnkV._NewEnum)作爲IEnumVariant」封裝在try/except中,它似乎正在工作。 – Mick

+0

@Arnaud我目前遇到了XE2和基於Add-In Express的Excel加載項問題。在XE2中編譯時,調用2010年的Excel COM接口現在失敗。我懷疑XE2 COM層已經發生了變化,你在這個答案中的評論讓我懷疑你的觀察結果與我的問題有關。你有沒有寫下你發現的有關XE2和COM的任何地方? –

+3

這聽起來完全像在http://stackoverflow.com/questions/7886116中陳述的內容 –