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

时间:2011-08-10 08:44:16

标签: c++ windows winapi clr hresult

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

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

4 个答案:

答案 0 :(得分:77)

您可以使用_com_error

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

如果您因任何原因不想使用_com_error,您仍然可以查看其来源,看看它是如何完成的。

不要忘记包含标题comdef.h

答案 1 :(得分:14)

Windows API就是FormatMessage。以下是解释如何操作的链接:How to obtain error message descriptions using the FormatMessage API

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

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

答案 2 :(得分:1)

以下是使用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()

答案 3 :(得分:0)

自c ++ 11起,此功能已内置到标准库中:

#include <system_error>

std::string message = std::system_category().message(hr)