web-dev-qa-db-ja.com

win APIを使用してHRESULT値の文字列表現を取得する方法はありますか?

HRESULT値の文字列表現を抽出するために使用できるwin APIに関数はありますか?

問題は、すべての戻り値がMSDNに記載されているわけではないことです。たとえば、 ExecuteInDefaultAppDomain() 関数は「0x80070002-指定されたファイルを見つけることができません。」を返すように記載されていません。したがって、よくあるケースで使用する関数があるかどうか疑問に思っていました。

55
khkarens

_ com_error を使用できます。

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

何らかの理由で_com_errorを使用したくない場合でも、そのソースを調べて、どのように実行されるかを確認できます。

ヘッダーcomdef.hを含めることを忘れないでください

80
eran

このためのWindows APIは FormatMessage です。その方法を説明するリンクを次に示します。 FormatMessage APIを使用してエラーメッセージの説明を取得する方法

Win32メッセージ(0x8007で始まるFRESILITY_WIN32のHRESULTを持つメッセージ)の場合、上位のWordを削除する必要があります。たとえば、0x80070002では、0x0002でFormatMessageを呼び出す必要があります。

ただし、どのタイプのメッセージに対しても常に機能するとは限りません。また、特定のメッセージ(テクノロジ、ベンダーなどに固有)については、対応するリソースDLLをロードする必要があります。これは、このDLLを見つける必要があるため、必ずしも簡単な作業ではありません。

14
Simon Mourier

C++ 11以降、この機能は標準ライブラリに組み込まれています。

#include <system_error>

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

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()
1
WebDrive