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#
6
A
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
No pase por alto el enlace de esa página que le lleva a How to: Map HRESULTs and Exceptions.
Cuestiones relacionadas
- 1. ¿Qué significa COM Error 80010105 y dónde encontrar otros códigos?
- 2. Diseñando códigos de error
- 3. ADB Códigos de error
- 4. ¿Hay una manera de decodificar COM error códigos numéricos en pywin32
- 5. Traducir Algoritmo C a Python
- 6. ¿Es correcto "traducir los mensajes de error?
- 7. error de compilación en el proyecto de C++ con códigos C y C++
- 8. ¿Traducir el código de C# en AST?
- 9. ¿Error del compilador C# o rareza COM normal?
- 10. MSMQ COM API en C#
- 11. Release COM Object en C#
- 12. NSURLErrorDomain descripción de códigos de error
- 13. Manejar eventos C# COM en C++
- 14. ¿CreateObject equivalente en C/C++? (COM Interop)
- 15. códigos de error Boost descripción legible
- 16. Obtenga códigos de error mientras usa psql
- 17. ¿Cómo traducir CType de VB.Net() para C#
- 18. Com + enlace en tiempo de C# 4.0
- 19. ¿Cómo puedo traducir los códigos clave de Linux de/dev/input/event * a ASCII
- 20. Traducir mensajes de error de validación de formularios de CodeIgniter
- 21. lista de códigos de error de Gestión para NSError en Objective C
- 22. C++ Herencia virtual múltiple frente a COM
- 23. ¿Cómo convertir/traducir información?
- 24. Error de iniciación de la biblioteca COM con el código 0x80010106 en C#
- 25. Herramienta para convertir (traducir) C para ir?
- 26. C# + COM Interop, versión determinística
- 27. ¿Cómo puedo destruir objetos COM en C#?
- 28. Crear servidor sustituto COM (exe) en C#
- 29. ¿Cómo escanear puertos COM en C#?
- 30. Lista de códigos de país - C#
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" –
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
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