2011-01-07 9 views
6

En C, Pascal y C++, es posible utilizar la función FormatMessage para recuperar un mensaje de error "amistoso" que corresponde a un código de error COM HRESULT. This question contiene código de ejemplo que demuestra el enfoque de C++. Por supuesto, sería posible construir un ensamblado C++ administrado para realizar esta función para el código C# y VB.NET, pero me pregunto: ¿hay alguna manera de traducir los códigos de error COM utilizando las bibliotecas del sistema .NET?Traducir códigos de error COM en C#

Respuesta

6

FormatMessage ya está utilizado internamente por Win32Exception. Por ejemplo:

using System; 

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

de salida: Error no especificado

asegúrese de evitar pasar por el HRESULT normal de comprobación de que se han hecho por el CLR en su capa de interoperabilidad COM. Utiliza IErrorInfo para obtener texto de error enriquecido del servidor COM. Eso te da el mensaje de error "real" en lugar del genérico.

2

Marshal.GetExceptionForHR();

No pase por alto el enlace de esa página que le lleva a How to: Map HRESULTs and Exceptions.

+0

No parece que esto proporcionará el mensaje descriptivo que puede obtener de FormatMessage(). Por ejemplo, la propiedad Mensaje de la Excepción creada desde E_FAIL usando GetExceptionForHR() simplemente dice, "Error HRESULT E_FAIL ha sido devuelto por una llamada a un componente COM" –

+0

Bueno, E_FAIL no es realmente un buen HRESULT; es básicamente un mensaje de error genérico. De WinError.h: '// MessageText: error no especificado'. Pasar E_FAIL a FormatMessage produce "Error no especificado". – codekaizen

+0

Pruebe con otro HRESULT, y obtendrá una excepción mejor: 'desmarcado {System.Runtime.InteropServices.Marshal.ThrowExceptionForHR ((int) 0x80070005L); } 'yields' Acceso denegado. (Excepción de HRESULT: 0x80070005 (E_ACCESSDENIED)) ' – codekaizen

Cuestiones relacionadas