【发布时间】:2012-04-27 09:23:12
【问题描述】:
要遵循典型的 COM 程序,无论何时发生任何错误,都必须执行以下操作:
- 检查
HRESULT和FAILED或类似的,看看是否发生错误。 - 创建一个变量来保存
IErrorInfo(通常是CComPtr<IErrorInfo>) - 致电
::GetErrorInfo(0, &var)。 - Get the human readable version of that by calling
IErrorInfo::GetDescription. - 将
BSTR转换为std::wstring。 - 将
std::wstring转换为某种形式的char const*。 - 抛出一个用户定义的异常类型,它派生自
std::exception,它公开了上面的第 1、5 和 6 位。
这一切看起来像是很多样板文件,几乎必须绕过 COM 中的每个函数调用。
我知道 MSVC++ 编译器提供了一大堆东西让 COM 更容易搞乱,例如 ATL,以及编译器特定的 COM 扩展 _com_error、_com_raise_error 和类似的,但我不知道如何使用这些,或者如果它们甚至打算由用户代码使用。
是否有任何典型的策略用于以异常安全和竞争条件安全的方式管理这种复杂性?
【问题讨论】:
-
从#import 指令开始,其余部分自动到位。
-
@HansPassant:我没有相关目标的类型库。 (我只有
wbemidl.h) -
那么fuggedaboudid,你得自己包起来。只需编写一个 CheckHR() 函数即可。
-
@HansPassant:是的,我可以自己包装这个,而不需要太多的努力;但是,如果在使用大量 COM 的人中已经有一种半标准的方法来做这件事,我想用典型的方式来做,而不是发明新的东西。
-
为什么是第 6 步?
std::exception不需要const char*。
标签: c++ windows visual-c++ com error-handling