我在VC ++中有一个带有c ++接口的第三方COM组件。我在下面的调用中遇到崩溃,这会导致我的应用程序崩溃。如何从这个不属于我的应用程序的功能中优雅地恢复?
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的东西。我真的有什么选择?我只是想给用户打开消息框并优雅地返回。
答案 0 :(得分: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
分配等也是如此。当使用来自COM DLL的#import
代码时,请习惯这种格式。使用来自MSVC的comutil库的生成的智能指针。
注意:_com_error
类提供了几个成员来获取错误发生的原因,包括HRESULT,错误描述字符串等。它甚至提供对错误返回对象创建的IErrorInfo
的访问权限。如果提供这样的细节水平那么好。