6

我有一个第三方 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 的东西。我真的有什么选择?我只想向用户显示消息框并优雅地返回。

4

1 回答 1

5

如果您尚未在代码中执行此操作,则需要来自调用方:

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分配等也可以。当使用#import来自 COM DLL 的代码时,如果使用从 MSVC 的 comutil 库生成的智能指针,请习惯这种格式。

注意:_com_error该类提供了几个成员来获取错误发生的原因,包括 HRESULT、错误描述字符串等。它甚至可以访问IErrorInfo由错误返回对象创建的对象,如果提供该级别的详细信息的话.

于 2013-02-11T16:25:24.267 回答