70

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

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

4

4 回答 4

107

您可以使用_com_error

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

如果你出于某种原因不想使用_com_error,你仍然可以看看它的源代码,看看它是如何完成的。

不要忘记包含标题comdef.h

于 2011-08-10T08:50:07.843 回答
30

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

#include <system_error>

std::string message = std::system_category().message(hr)
于 2019-06-04T22:57:49.937 回答
17

用于此的 Windows API 是FormatMessage。这是一个解释如何执行此操作的链接:检索错误消息

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

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

于 2011-08-10T09:03:29.243 回答
2

这是使用 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()
于 2016-05-26T15:27:27.833 回答