为了遵循典型的COM流程,每当出现任何错误时,必须执行以下操作:
我知道MSVC++编译器提供了许多东西,使与COM的交互更加容易,例如ATL和编译器特定的COM扩展
在异常安全和竞争条件安全的情况下,是否有任何典型策略用于管理此复杂性?
- 使用
FAILED
或类似方法检查HRESULT
,以查看是否发生了错误。 - 创建一个变量来保存
IErrorInfo
(通常为CComPtr<IErrorInfo>
)。 - 调用
::GetErrorInfo(0, &var)
。 - 通过调用
IErrorInfo::GetDescription
获得可读版本。 - 将
BSTR
转换为std::wstring
。 - 将
std::wstring
转换为某种形式的char const*
。 - 抛出用户定义的异常类型,该类型派生自
std::exception
,并公开上述位1、5和6。
我知道MSVC++编译器提供了许多东西,使与COM的交互更加容易,例如ATL和编译器特定的COM扩展
_com_error
、_com_raise_error
等,但我不确定如何使用这些东西,或者它们是否甚至是用于用户代码的。在异常安全和竞争条件安全的情况下,是否有任何典型策略用于管理此复杂性?
const char*
来实现std::exception::what
。 - Billy ONeal