2013-10-16 52 views
4

我有一個帶4個接口的Delphi ActiveX項目。其中兩個爲他們的CoClasses提供了AutoComObject工廠。接口的所有方法都使用safecalls聲明。在與工廠的接口中,如果在任何方法中拋出異常,調用者將收到一個EOleException異常消息,其中包含來自activex中原始異常的異常消息。但在其他兩個接口中,任何異常都會被屏蔽爲EOleException,並將消息屏蔽爲「災難性故障」。COM接口總是屏蔽「災難性故障」的異常消息

任何人都知道爲什麼會發生這種情況,以及如何使原始異常消息不被屏蔽?

回答

8

如果未處理的異常轉義類的safecall方法,則調用TObject.SafeCallException()將異常轉換爲HRESULT錯誤代碼,然後由COM將其返回給調用方。默認情況下,TObject.SafeCallException()始終返回E_UNEXPECTED$8000FFFF)。一個班級可以覆蓋SafeCallException()以返回更有意義的HRESULTTComObjectTAutoIntfObject這樣做,例如(他們也呼叫SetErrorInfo()設置有關異常的詳細信息,如果需要,調用者可以使用GetErrorInfo()檢索)。所以這聽起來像你的兩個基於AutoComObject的對象有一個SafeCallException()的實現,而你的其他兩個對象不這樣做。

+1

謝謝,你的回答很有幫助。爲這兩個類創建一個autoobject工廠,並聲明它們從TAutoObject擴展,而TAutoObject又從TComObject擴展,解決了這個問題。 –

相關問題