システムからエラーメッセージを返す適切な方法HRESULT
は次のとおりです(この場合はhresultという名前ですが、に置き換えることができますGetLastError()
)。
LPTSTR errorText = NULL;
FormatMessage(
// use system message tables to retrieve error text
FORMAT_MESSAGE_FROM_SYSTEM
// allocate buffer on local heap for error text
|FORMAT_MESSAGE_ALLOCATE_BUFFER
// Important! will fail otherwise, since we're not
// (and CANNOT) pass insertion parameters
|FORMAT_MESSAGE_IGNORE_INSERTS,
NULL, // unused with FORMAT_MESSAGE_FROM_SYSTEM
hresult,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPTSTR)&errorText, // output
0, // minimum size for output buffer
NULL); // arguments - see note
if ( NULL != errorText )
{
// ... do something with the string `errorText` - log it, display it to the user, etc.
// release memory allocated by FormatMessage()
LocalFree(errorText);
errorText = NULL;
}
これとDavid Hanakの回答の主な違いは、FORMAT_MESSAGE_IGNORE_INSERTS
フラグの使用です。MSDNは挿入がどのように使用されるべきかについて少し不明確ですが、レイモンドチェンはシステムが期待する挿入を知る方法がないので、システムメッセージを取得するときにそれらを使用してはならないことを指摘します。
FWIW、Visual C ++を使用している場合は、_com_error
クラスを使用することで生活を少し楽にすることができます。
{
_com_error error(hresult);
LPCTSTR errorText = error.ErrorMessage();
// do something with the error...
//automatic cleanup when error goes out of scope
}
私が知る限り、MFCまたはATLの一部ではありません。