直接看代码:
CString GetComExceptionMessage(HRESULT hr)
{
CString strMessage;
switch (hr)
{
case S_OK:
case S_FALSE:
strMessage.Format(_T("%ld - %s"), hr, _T("无执行错误"));
break;
case E_FAIL:
strMessage.Format(_T("%ld - %s"),hr,_T("语法错误"));
break;
case E_INVALIDARG:
strMessage.Format(_T("%ld - %s"),hr,_T("一个或多个参数无效"));
break;
case E_NOINTERFACE:
strMessage.Format(_T("%ld - %s"),hr,_T("不支持此接口"));
break;
case E_NOTIMPL:
strMessage.Format(_T("%ld - %s"),hr,_T("未实现"));
break;
case E_OUTOFMEMORY:
strMessage.Format(_T("%ld - %s"),hr,_T("未能分配所需的内存"));
break;
case E_POINTER:
strMessage.Format(_T("%ld - %s"),hr,_T("无效的指针"));
break;
case E_UNEXPECTED:
strMessage.Format(_T("%ld - %s"),hr,_T("未知错误"));
break;
case E_HANDLE:
strMessage.Format(_T("%ld - %s"),hr,_T("无效句柄"));
break;
case E_ABORT:
strMessage.Format(_T("%ld - %s"),hr,_T("执行被取消"));
break;
case E_ACCESSDENIED:
strMessage.Format(_T("%ld - %s"),hr,_T("禁止访问"));
break;
case E_PENDING:
strMessage.Format(_T("%ld - %s"),hr,_T("执行被挂起"));
break;
default:
{
IErrorInfoPtr ipErrorInfo;
BSTR description(_bstr_t(_T("")));
GetErrorInfo(NULL, &ipErrorInfo);
if (ipErrorInfo)
{
ipErrorInfo->GetDescription(&description);
strMessage = description;
USES_CONVERSION;
}
strMessage.Format(_T("%ld - %s"), (long)hr, (CString)strMessage);
}
}
return strMessage;
}
本文介绍了一个用于处理COM异常的实用函数CStringGetComExceptionMessage。该函数通过解析不同的HRESULT值来生成详细的异常信息,帮助开发者快速定位问题。对于常见的错误代码,如E_FAIL、E_INVALIDARG等,函数提供了明确的描述;对于未知错误,则尝试通过IErrorInfo接口获取更具体的信息。

被折叠的 条评论
为什么被折叠?



