如何从COM错误中正常恢复
How to recover from COM error gracefully?
我有一个第三方COM组件,它的c++接口在VC++中。我在下面的调用中遇到崩溃,导致我的应用程序崩溃。我如何才能从这个不是我应用程序的一部分的函数中优雅地恢复?
inline _RecordsetPtr IGLibMgr::GetLibInfo ( _bstr_t LibPath ) {
struct _Recordset * _result = 0;
HRESULT _hr = raw_GetLibInfo(LibPath, &_result);
if (FAILED(_hr)) _com_issue_errorex(_hr, this, __uuidof(this));
return _RecordsetPtr(_result, false);
}
它在最后一行崩溃了。我不认为我可以修改这个代码,因为它是第三方COM的东西。我真的有什么选择?我只想向用户显示消息框,然后优雅地返回。
如果您的代码中还没有这样做,那么您需要来自调用方:
try
{ // setup your invoke for your object...
IGLibMgrPtr spMgr = ....
bstr_t bstrPath = ....
// invoke your call.
_RecordsetPtr spRS = spMgr->GetLibInfo(bstrPath);
... continue normal processing ...
}
catch(const _com_error& ce)
{
// handle your error here.
}
这在多个层面上都很重要。最明显的是,IGLibMgr
成员不仅可以抛出异常,bstr_t
分配等也可以。当使用COM DLL中的#import
代码时,如果使用MSVC的comutil库中生成的智能指针,请习惯这种格式。
注意:_com_error
类提供了几个成员来获取错误发生的原因,包括HRESULT、错误描述字符串等。如果它很好地提供了该级别的详细信息,它甚至可以访问由错误返回对象创建的IErrorInfo
。
相关文章:
- 用C++将哈希表写入文件并从文件中恢复
- Opencv 恢复到比我设置的更高的分辨率
- 变量在使用赋值语句赋值后恢复为以前的值
- 在信号处理程序中捕获C++未处理的异常并恢复应用程序
- 删除所有字符串后如何恢复 QStringList?
- 当对套接字 send() 的同步调用由于连接另一端丢失而被阻止时,如何恢复?
- 如何仅使用一次固定<<设置精度(2)?或者至少恢复到默认行为?
- "co_yield"是否可以在恢复协程时从调用方返回值?
- OpenSSL C API:如何在程序exec()之后恢复TLS连接?
- 通过指针恢复对数组的引用.UB与否?
- 从不同进程中的另一个线程挂起/恢复线程或进程
- 如何在 XML 中正确存储原始字节数据并恢复它?
- ExtTextOut 文本的持续闪烁,在一段时间后,文本将恢复为默认字体
- 模板化类中运算符 + 重载的值的恢复
- C++ 线程创建/删除与线程停止/恢复
- ZMQ::send() 抛出异常并终止 QNX 进程.为什么以及如何从中恢复?
- Windows桌面程序保存您的计算机会话 - 基于程序崩溃时的恢复会话
- xSemaphoreTake 在调用 xSemaphoreGive 后不会恢复任务
- 将类型映射到整数值后,如何在给定整数值的情况下恢复类型?
- 恢复ASIO无堆栈Coroutine