2011-01-07 2 views
6

Trong C, Pascal và C++, bạn có thể sử dụng chức năng FormatMessage để truy xuất thông báo lỗi "thân thiện" tương ứng với mã lỗi COM HRESULT. This question chứa mã mẫu thể hiện cách tiếp cận C++. Tất nhiên nó sẽ có thể xây dựng một hội đồng quản trị C + + để thực hiện chức năng này cho mã C# và VB.NET, nhưng tôi tự hỏi: có cách nào để dịch mã lỗi COM bằng cách sử dụng thư viện hệ thống .NET không?Dịch mã lỗi COM trong C#

Trả lời

6

FormatMessage đã được sử dụng trong nội bộ bởi Win32Exception. Ví dụ:

using System; 

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

Output: Lỗi Unspecified

Hãy chắc chắn để tránh bỏ qua các HRESULT bình thường kiểm tra đã xong bởi CLR trong lớp COM interop của nó. Nó sử dụng IErrorInfo để có được văn bản lỗi phong phú từ máy chủ COM. Điều đó giúp bạn nhận được thông báo lỗi 'thực' thay vì thông báo lỗi chung.

2

Marshal.GetExceptionForHR();

Đừng bỏ qua các liên kết trên trang đó mà sẽ đưa bạn đến How to: Map HRESULTs and Exceptions.

+0

Có vẻ như điều này sẽ cung cấp thông báo mô tả mà bạn có thể nhận được từ FormatMessage(). Ví dụ, thuộc tính Message của Exception được tạo ra từ E_FAIL sử dụng GetExceptionForHR() chỉ cần nói, "Lỗi HRESULT E_FAIL đã được trả về từ một cuộc gọi đến một thành phần COM" –

+0

Vâng, E_FAIL thực sự không phải là một HRESULT tốt; nó về cơ bản là một thông báo lỗi chung. Từ WinError.h: '// MessageText: Lỗi không xác định'. Việc chuyển E_FAIL sang FormatMessage sẽ sinh ra "Lỗi không xác định". – codekaizen

+0

Hãy thử một HRESULT khác, và bạn nhận được một ngoại lệ tốt hơn: 'không được kiểm tra {System.Runtime.InteropServices.Marshal.ThrowExceptionForHR ((int) 0x80070005L); } 'yields' Truy cập bị từ chối. (Ngoại lệ từ HRESULT: 0x80070005 (E_ACCESSDENIED)) ' – codekaizen