HRESULT値の文字列表現を抽出するために使用できるwin APIに関数はありますか?
問題は、すべての戻り値がMSDNに記載されているわけではないことです。たとえば、 ExecuteInDefaultAppDomain() 関数は「0x80070002-指定されたファイルを見つけることができません。」を返すように記載されていません。したがって、よくあるケースで使用する関数があるかどうか疑問に思っていました。
_ com_error を使用できます。
_com_error err(hr);
LPCTSTR errMsg = err.ErrorMessage();
何らかの理由で_com_error
を使用したくない場合でも、そのソースを調べて、どのように実行されるかを確認できます。
ヘッダーcomdef.h
を含めることを忘れないでください
このためのWindows APIは FormatMessage です。その方法を説明するリンクを次に示します。 FormatMessage APIを使用してエラーメッセージの説明を取得する方法 。
Win32メッセージ(0x8007で始まるFRESILITY_WIN32のHRESULTを持つメッセージ)の場合、上位のWordを削除する必要があります。たとえば、0x80070002では、0x0002でFormatMessageを呼び出す必要があります。
ただし、どのタイプのメッセージに対しても常に機能するとは限りません。また、特定のメッセージ(テクノロジ、ベンダーなどに固有)については、対応するリソースDLLをロードする必要があります。これは、このDLLを見つける必要があるため、必ずしも簡単な作業ではありません。
C++ 11以降、この機能は標準ライブラリに組み込まれています。
#include <system_error>
std::string message = std::system_category().message(hr)
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()