2013-04-23 77 views
2

我在Delphi XE2中的兩個單獨項目中創建了兩個activex組件。其中一個組件完美工作,它引發的每個異常都會被屏蔽爲EOleException。在另一個activex組件上,異常不會被屏蔽,它們將作爲其原始類型拋出。客戶端是一個delphi XE程序。ActiveX不會提升EOleException

當activex組件引發原始異常時,下一次對組件中任何其他方法的調用將在它不應該引發的位置拋出Access Violation異常,如使用值設置本地字符串變量。這是一個非常奇怪的行爲。

我比較了兩個項目的.ridl文件,編譯選項,.dproj文件,並且找不到罪魁禍首。

任何人都知道這種差異/奇怪行爲的原因?

感謝

編輯:一些代碼

組件1,工程(屏蔽所有例外EOleException)

TspdMyClassX = class(TActiveXComponent, MyInterface) 

...

initialization 


TActiveXComponentFactory.Create(
    ComServer, 
    TspdMyClassX, 
    CLASS_spdMyClassX, 
    1, 
    '', 
    0, 
    tmBoth); 

該做的其他組件不是拋出EOleException有不同的接口,但其餘的代碼是相同的初始化,父類TActiveXComponent)

+0

請顯示一些實際的代碼。 – 2013-04-23 20:11:31

+0

您是否比較過「使用」條款中包含的單位的順序?如果兩個包含的文件都處理異常,那麼它可能使用兩個項目之間不同單元的代碼。它使用它首先找到的代碼,從'uses'子句中的最後一個單元開始,並從那裏開始向後工作。 – 2013-04-24 04:10:25

+0

我發現如果我定義了一個不帶任何參數且沒有返回值的方法,那麼該組件將屏蔽使用EOleException在方法內生成的異常。當方法有返回值或參數時,異常不會被屏蔽。我正在從零開始在delphi 7上做同樣的項目,看看它是否是一些delphi xe2相關的錯誤。 – 2013-04-24 12:30:38

回答

1

在我看來,問題是與德爾福XE2生成的.ridl/.tlb文件。我用delphi 7重新設計了這個組件,然後在delphi xe2中打開了這個項目,並且只編譯/構建了它(在.ridl中沒有編輯,在delphi xe2中沒有更改TLB)。所有異常被EOleException正確屏蔽並且問題解決了

+0

將文件與Delphi XE2中設計的版本進行比較後,我注意到一些方法是在xe2中使用「stdcall」生成的,而delphi 7使用「safecall」生成所有方法。 – 2013-04-24 18:16:32

+0

這裏是我在上面的鏈接中找到的一些信息,在「http://www.delphipages.com/forum/showthread.php?t=86698 – 2013-04-24 20:03:43

+0

」上找到,「safecall約定實現COM錯誤和異常處理。」 – 2013-04-24 20:04:15