2011-05-23 64 views
2

基於此回答:Catching COMException specific Error Code,我想知道,如果我只需要查看異常的特定部分,就可以正確處理跨操作系統和多個版本的OL的COMException。例如,如何處理Outlook插件中的HRESULT?

private const uint HRESULT_OPERATIONABORTED = 0x80004004; 

// ... 

    try { 
     // something that could throw COMExceptions 
    } catch (System.Runtime.InteropServices.COMException e) { 

     switch ((uint)e.ErrorCode) { 

      case HRESULT_OPERATIONABORTED: 
       break; 

      default: 
       break; 
     } 
    } 

這是足夠的跨平臺,或者是有必要只考慮錯誤代碼的一部分嗎?

編輯 - 只是爲了澄清,我確切的問題是,是否比較(uint)e.ErrorCode0x80004004太具體的(也就是說,是否我總是得到0x80004004此特定錯誤,無論OS/OL),或者如果這是做事情的正確方法。

回答

0

就跨平臺兼容而言,您幾乎沒有什麼可擔心的,COM只能在Windows上運行。同樣,錯誤代碼是一個明確定義的錯誤代碼。您可以在WinError.h SDK頭文件中查找標準COM錯誤代碼。它是E_ABORT。我建議你實際使用該標識符。

您會在c:\ program files \ microsoft sdks \ windows \ v6.0 \ include中找到此標頭。 VS2010是v7.0。

+0

我只是說,XP和Win7之間。感謝標題,這正是我需要的。 – wes 2011-05-23 23:27:01

0

您可能還需要考慮捕獲System.OutOfMemoryException和COM對象返回的HRESULT結果的其他異常。並非所有失敗的HRESULT都會導致COMException。

對於我所見過的大多數MAPI錯誤,錯誤代碼與標準C MAPI頭文件中聲明的內容不同,所以我認爲switch語句沒問題。換句話說,該方法不應該比C編寫的MAPI客戶端應用程序更不兼容。