要遵循典型的 COM 程序,无论何时发生任何错误,都必须执行以下操作:
- 检查
HRESULT
withFAILED
或类似,以查看是否发生错误。 - 创建一个变量来保存
IErrorInfo
(通常CComPtr<IErrorInfo>
) - 打电话
::GetErrorInfo(0, &var)
。 - 通过调用
IErrorInfo::GetDescription
. - 将 转换
BSTR
为std::wstring
. - 将 转换
std::wstring
为某种形式的char const*
. - 抛出一个用户定义的异常类型,该类型派生出
std::exception
上述第 1、5 和 6 位。
这一切看起来像是很多样板文件,几乎必须绕过 COM 中的每个函数调用。
我知道 MSVC++ 编译器提供了一大堆东西来让 COM 更容易搞乱,例如 ATL,以及编译器特定的 COM 扩展_com_error
等_com_raise_error
,但我不知道如何使用这些,或者它们是否是有意的供用户代码使用。
是否有任何典型的策略用于以异常安全和竞争条件安全的方式管理这种复杂性?