C++ 有没有一种方法可以使用WinAPI获取HRESULT值的字符串表示形式?
win API中是否有一个函数可用于提取HRESULT值的字符串表示形式 问题在于并非所有返回值都记录在MSDN中,例如,函数未记录为返回“0x80070002-系统无法找到指定的文件”。但是,它确实存在!因此,我想知道是否有一个函数可以在普通情况下使用。您可以使用: 如果您不想出于任何原因使用C++ 有没有一种方法可以使用WinAPI获取HRESULT值的字符串表示形式?,c++,windows,winapi,clr,hresult,C++,Windows,Winapi,Clr,Hresult,win API中是否有一个函数可用于提取HRESULT值的字符串表示形式 问题在于并非所有返回值都记录在MSDN中,例如,函数未记录为返回“0x80070002-系统无法找到指定的文件”。但是,它确实存在!因此,我想知道是否有一个函数可以在普通情况下使用。您可以使用: 如果您不想出于任何原因使用\u com\u error,您仍然可以查看它的源代码,看看它是如何完成的 不要忘了包括标题comdef.h这是Windows API的一部分。下面是一个链接,说明如何执行此操作: 对于Win32消息(具
\u com\u error
,您仍然可以查看它的源代码,看看它是如何完成的
不要忘了包括标题
comdef.h
这是Windows API的一部分。下面是一个链接,说明如何执行此操作:
对于Win32消息(具有以0x8007开头的HRESULT的消息,即FACILITY_Win32),需要删除高阶字。例如,在0x80070002中,需要使用0x0002调用FormatMessage
但是,它并不总是适用于任何类型的消息。对于某些特定的消息(特定于技术、供应商等),您需要加载相应的资源DLL,这并不总是一件容易的任务,因为您需要找到此DLL。下面是使用FormatMessage()的示例
自c++11以来,此功能已内置到标准库中:
#包括
std::string message=std::system_category().消息(hr)
标题不同,但基本上答案与答案相同。0x8007中的7是FACILITY_WIN32,而不是FACILITY_ITF。例如,请参见HRESULT\u code(hr)
中的“COM错误代码的结构”可以将其转换为win32错误代码为了方便起见,提供了一个更完整的示例:内联CString GetMessageForHresult(HRESULT hr){COM\u错误(hr);CString cs;cs.Format(_T(“错误0x%08x:%s”),hr,Error.ErrorMessage());return cs;}所需的头文件:#include@nietras什么是<代码> cString ?@ PhanyItvij>,代码> cString < /Cord>是MFC的字符串类型(实际C++类,即不是指向C字符串的指针,如HRESULT
错误代码@您是否将hread
与NT\u状态混为一谈
。虽然它们有相似的编码,但前者在整个Windows API(COM)以及Windows运行时中都使用。您不会在内核模式模块中使用任何一个。\u com\u error
中的
很好地为您封装了所有内容,而无需使用。。。可悲的是,这把你推到了一个窗口地带。我们实际上可能会重新实现它,减去IErrorInfo
功能。不使用std库。
_com_error err(hr);
LPCTSTR errMsg = err.ErrorMessage();
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()