gpt4 book ai didi

c++ - 我如何(有没有办法)将 HRESULT 转换为系统特定的错误消息?

转载 作者:可可西里 更新时间:2023-11-01 12:42:53 27 4
gpt4 key购买 nike

根据 this ,无法将 HRESULT 错误代码转换为 Win32 错误代码。因此(至少据我所知),我使用 FormatMessage 来生成错误消息(即

std::wstring Exception::GetWideMessage() const
{
using std::tr1::shared_ptr;
shared_ptr<void> buff;
LPWSTR buffPtr;
DWORD bufferLength = FormatMessageW(
FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
GetErrorCode(),
0,
reinterpret_cast<LPWSTR>(&buffPtr),
0,
NULL);
buff.reset(buffPtr, LocalFreeHelper());
return std::wstring(buffPtr, bufferLength);
}

) 不适用于 HRESULT。

如何为 HRESULT 生成这些类型的系统特定错误字符串?

最佳答案

这个答案结合了Raymond Chen的思路,正确的识别了传入的HRESULT,并使用正确的工具返回错误字符串,得到错误信息:

/////////////////////////////
// ComException

CString FormatMessage(HRESULT result)
{
CString strMessage;
WORD facility = HRESULT_FACILITY(result);
CComPtr<IErrorInfo> iei;
if (S_OK == GetErrorInfo(0, &iei) && iei)
{
// get the error description from the IErrorInfo
BSTR bstr = NULL;
if (SUCCEEDED(iei->GetDescription(&bstr)))
{
// append the description to our label
strMessage.Append(bstr);

// done with BSTR, do manual cleanup
SysFreeString(bstr);
}
}
else if (facility == FACILITY_ITF)
{
// interface specific - no standard mapping available
strMessage.Append(_T("FACILITY_ITF - This error is interface specific. No further information is available."));
}
else
{
// attempt to treat as a standard, system error, and ask FormatMessage to explain it
CString error;
CErrorMessage::FormatMessage(error, result); // <- This is just a wrapper for ::FormatMessage, left to reader as an exercise :)
if (!error.IsEmpty())
strMessage.Append(error);
}
return strMessage;
}

关于c++ - 我如何(有没有办法)将 HRESULT 转换为系统特定的错误消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4597932/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com