为 HRESULT 代码生成诊断消息?
Posted
技术标签:
【中文标题】为 HRESULT 代码生成诊断消息?【英文标题】:Generate diagnostic message for HRESULT codes? 【发布时间】:2009-12-03 22:48:48 【问题描述】:我希望能够执行与 FormatMessage 等效的操作 - 生成用于调试甚至运行时构建的文本消息,可以报告一些常见的 HRESULT,甚至吐出诸如严重性是什么、它是什么设施等信息是,并且可能是错误代码的描述。
我找到了this simple function,但它太简单了,而且似乎大多会产生“未知错误”。但到目前为止,我还没有发现任何看起来更有希望的东西。
我可以执行以下操作:
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
Append(bstr);
// done with BSTR, do manual cleanup
SysFreeString(bstr);
else if (HRESULT_FACILITY(hr) == FACILITY_WIN32)
// append the description to our label
Append(CErrorMessage(HRESULT_CODE(hr)).c_str());
但是,我想知道我是否完成了比 _com_error 更多的事情。
有没有人知道为 HRESULT 生成错误日志输出的合理充实的工具?
【问题讨论】:
【参考方案1】:如果您直接使用 WIN32,FormatMessage() 调用应该可以帮助您。
【讨论】:
【参考方案2】:如您所见,_com_error::ErrorMessage()
应该可以解决问题。
如果您收到“未知错误”,那么您收到的 HRESULT 可能不为 Windows 所知。对于这些消息,请尝试转储 HRESULT 值和 figuring out if they actually map to win32 error codes。
有some com macros available可以帮你拆分HRESULT的位。
【讨论】:
这和 boost::system 库看起来都很好。谢谢。 :)【参考方案3】:您在使用 Boost 吗? boost::system 库会自动查找 HRESULT 和 Win32 API 结果代码。
【讨论】:
以上是关于为 HRESULT 代码生成诊断消息?的主要内容,如果未能解决你的问题,请参考以下文章
HRESULT、DWORD 和 HANDLE 在非托管代码中是啥意思?
从 sqlserver HRESULT 填充 Excel 工作簿:0x800401A8 错误