2011-01-07 58 views
6

在C,Pascal和C++中,可以使用FormatMessage函數檢索對應於COM HRESULT錯誤代碼的「友好」錯誤消息。 This question包含演示C++方法的示例代碼。當然,構建一個託管的C++程序集來執行C#和VB.NET代碼的這個功能是可能的,但是我想知道:有沒有辦法使用.NET系統庫來翻譯COM錯誤代碼?在C#中轉換COM錯誤代碼

回答

6

FormatMessage已由Win32Exception內部使用。例如:

using System; 

class Program { 
    static void Main(string[] args) { 
     var ex = new System.ComponentModel.Win32Exception(unchecked((int)0x80004005)); 
     Console.WriteLine(ex.Message); 
     Console.ReadLine(); 
    } 
} 

輸出:未指定的錯誤

一定要避免繞過正常HRESULT檢查的方法是,其COM互操作層的CLR實現。它使用IErrorInfo從COM服務器獲取豐富的錯誤文本。這會讓你獲得'真正'的錯誤信息,而不是通用的錯誤信息。

2

Marshal.GetExceptionForHR();

不要忽視的是,頁面會轉至How to: Map HRESULTs and Exceptions鏈接。

+0

它不看這個,它將提供您可以從FormatMessage()獲得的描述性消息。例如,使用GetExceptionForHR()從E_FAIL創建的Exception的Message屬性只是說:「錯誤HRESULT E_FAIL已經從調用COM組件返回」 – 2011-01-07 01:35:31