如何从COM错误中正常恢复

How to recover from COM error gracefully?

本文关键字:常恢复 恢复 COM 错误      更新时间:2023-10-16

我有一个第三方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