有没有办法使用win API获取HRESULT值的字符串表示?

khk*_*ens 56 c++ windows clr winapi hresult

win API中是否有一个函数可用于提取HRESULT值的字符串表示形式?

问题是并非所有返回值都记录在MSDN中,例如,ExecuteInDefaultAppDomain()函数未记录为返回"0x80070002 - 系统找不到指定的文件."但是,确实如此!因此,我想知道是否有一个常用的功能.

era*_*ran 82

你可以使用_com_error:

_com_error err(hr);
LPCTSTR errMsg = err.ErrorMessage();
Run Code Online (Sandbox Code Playgroud)

如果您不想_com_error出于任何原因使用它,您仍然可以查看其来源,并了解它是如何完成的.

不要忘记包含标题 comdef.h

  • 为方便起见,更完整的示例:内联CString GetMessageForHresult(HRESULT hr){_ com_error error(hr); CString cs; cs.Format(_T("Error 0x%08x:%s"),hr,error.ErrorMessage()); 返回cs; } (6认同)
  • 需要头文件:#include <comdef.h> (3认同)
  • @nietras 什么是“CString”? (2认同)
  • 我们应该如何释放 errMsg? (2认同)

Sim*_*ier 14

Windows API就是FormatMessage.以下是解释如何执行此操作的链接:如何使用FormatMessage API获取错误消息说明.

对于Win32消息(HRESULT以0x8007开头的消息,即FACILITY_WIN32),您需要删除hi命令字.例如,在0x80070002中,您需要使用0x0002调用FormatMessage.

但是,它并不总是适用于任何类型的消息.对于某些特定的消息(特定于技术,供应商等),您需要加载相应的资源DLL,这并不总是一件容易的事,因为您需要找到此DLL.

  • `HRESULT_CODE(hr)` 可以将其转换为 win32 错误代码 (5认同)
  • 0x8007中的7是FACILITY_WIN32,而不是FACILITY_ITF。例如,请参阅“COM 错误代码的结构”:http://msdn.microsoft.com/en-us/library/ms690088 (3认同)

Chr*_*ial 6

从c ++ 11开始,此功能已内置到标准库中:

#include <system_error>

std::string message = std::system_category().message(hr)
Run Code Online (Sandbox Code Playgroud)

  • 这适用于系统错误,而不是通用的“HRESULT”错误代码。@che您将“HRESILT”与“NT_STATUS”混淆了。尽管它们具有相似的编码,但前者在整个 Windows API (COM) 以及 Windows 运行时中使用。您不会在内核模式模块中使用其中任何一个。 (3认同)