C++ 有没有一种方法可以使用WinAPI获取HRESULT值的字符串表示形式?

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消息(具

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

问题在于并非所有返回值都记录在MSDN中,例如,函数未记录为返回“0x80070002-系统无法找到指定的文件”。但是,它确实存在!因此,我想知道是否有一个函数可以在普通情况下使用。

您可以使用:

如果您不想出于任何原因使用
\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字符串的指针,如 LPCTSTR ),我们应该如何释放ErrMSG?Win32是C,上面是C和C++异常的混合。我不知道<代码> FrastMeist< /C>或其他任何Win32函数TrWS C++异常?code>FormatMessage返回一个值,并且有很好的文档记录。和。该函数不能用于原始镜像值。HRESULT_代码(hr)将(很可能)为您提供调用该函数所需的错误代码。如果您在该注释中给出了-1,请解释原因?我总是感激学习。这适用于系统错误,而不是一般的
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()