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

win API中有没有函数可以用来提取HRESULT值的string表示?

问题是不是所有的返回值都logging在MSDN中,例如ExecuteInDefaultAppDomain()函数没有logging为返回“0x80070002 – 系统找不到指定的文件”,但是,它确实! 因此,我想知道是否有一个常用的function。

3 Solutions collect form web for “有没有办法使用win API获取HRESULT值的string表示?”

你可以使用_com_error :

_com_error err(hr); LPCTSTR errMsg = err.ErrorMessage(); 

如果你不想因为什么原因使用_com_error ,你仍然可以看看它的源头,看看它是如何完成的。

不要忘记包含头comdef.h

Windows API是FormatMessage 。 以下链接介绍了如何执行此操作: 如何使用FormatMessage API获取错误消息描述 。

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

但是,它并不总是适用于任何types的消息。 对于一些特定的消息(特定于技术,供应商等),您需要加载相应的资源DLL,这并不总是一件容易的事情,因为您需要find这个DLL。

这是一个使用FormatMessage()的示例

 LPTSTR SRUTIL_WinErrorMsg(int nErrorCode, LPTSTR pStr, WORD wLength ) { try { LPTSTR szBuffer = pStr; int nBufferSize = wLength; // // prime buffer with error code // wsprintf( szBuffer, _T("Error code %u"), nErrorCode); // // if we have a message, replace default with msg. // FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, nErrorCode, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language (LPTSTR) szBuffer, nBufferSize, NULL ); } catch(...) { } return pStr; } // End of SRUTIL_WinErrorMsg() 
  • 更改主音量级别
  • 用C ++parsingINI文件最简单的方法是什么?
  • 在Windows中查找未公开的API
  • C# - 检测上次用户与操作系统交互的时间
  • WIN32_Processor :: ProcessorId对于所有计算机都是唯一的
  • 如何链接到Code :: Blocks的库?
  • 我只使用脚本的名字在Windows上运行Python脚本时,无法redirect输出
  • 控制台应用程序中的全局热键
  • 如何在Visual Studio C ++中使用第三方DLL文件?
  • 为什么closures使用AllocConsole启动的控制台会导致我的整个应用程序退出? 我可以改变这种行为吗?
  • Send Message和Post Message之间有什么区别,以及这些与C#,WPF和Pure windows编程有什么关系?