2014-09-21 43 views
-1

有一箇舊項目需要重新編譯爲XE5,以避免原始D7組件帶來的奇怪的Twebbrowser錯誤。下面的代碼在D7上運行良好,但在XE5上運行得不錯。錯誤從Delphi 7重新編譯爲XE5

function GetFrame(FrameNo: Integer; WB: TWEbbrowser): IWebbrowser2; 
    var 
     OleContainer: IOleContainer; 
     enum: IEnumUnknown; 
     unk: IUnknown; 
     Fetched: PLongint; 
    begin 
     while WB.ReadyState <> READYSTATE_COMPLETE do 
     Application.ProcessMessages; 
     if Assigned(WB.document) then 
     begin 
     Fetched := nil; 
     OleContainer := WB.Document as IOleContainer; 
     OleContainer.EnumObjects(OLECONTF_EMBEDDINGS, Enum); 
     Enum.Skip(FrameNo); 
     Enum.Next(1, Unk, Fetched); 
     Result := Unk as IWebbrowser2; 
     end 
     else 
     Result := nil; 
    end; 

我檢查和EnumObjects的參數是在兩個版本相同,但XE5說:「E2033,實際和正式參必須是相同的」。 任何想法如何我可以重新編譯這隻小狗?謝謝。和平!

+0

當你有編譯器錯誤時,告訴我們哪一行生成它。另請嘗試閱讀編譯器錯誤的文檔。 E2033被記錄。 – 2014-09-21 17:24:46

+0

該行是OleContainer.EnumObjects(OLECONTF_EMBEDDINGS,Enum); – 2014-09-21 18:21:25

回答

4

對於可變參數,實際參數必須是形式參數的確切類型。

如果你得到我可以假設類型的枚舉變量的錯誤不是類型:ActiveX.IEnumUnknown,所以你可以嘗試改變這一行的變量聲明部分:

enum: IEnumUnknown; 

到:

enum: ActiveX.IEnumUnknown; 
+0

是的。你是對的。非常感謝Aleroot!和平! – 2014-09-21 18:22:04

+1

也許在這裏更深入的調查是明智的。我想知道這個IEnumUnknown是在哪裏聲明的,以及爲什麼它隱藏另一個。理想情況下,如果可能的話,我寧願通過從範圍中移除僞造的「IEnumUnknown」來處理該問題。 – 2014-09-22 08:12:00

+0

我同意@David。其他IEnumUnknown來自MSHTML。 Aleroot提出的更改使得代碼無懈可擊地重新編譯,但該應用程序未按預期工作。我用它來填寫每天只開放幾個小時的政府表格,所以我現在就可以測試它了。我需要調查更多。謝謝。 – 2014-09-22 13:37:41