gpt4 book ai didi

c++ - 在 C++ 中调用 COM 时如何包装错误?

转载 作者:可可西里 更新时间:2023-11-01 14:52:01 24 4
gpt4 key购买 nike

要遵循典型的 COM 过程,无论何时发生任何错误,都必须执行以下操作:

  1. 检查 HRESULTFAILED或类似的,看看是否发生了错误。
  2. 创建一个变量来保存 IErrorInfo (通常为 CComPtr<IErrorInfo> )
  3. 调用::GetErrorInfo(0, &var) .
  4. Get the human readable version of that by calling IErrorInfo::GetDescription .
  5. 转换 BSTR进入std::wstring .
  6. 转换 std::wstring变成某种形式的 char const* .
  7. 抛出派生自 std::exception 的用户定义异常类型它公开了上面的位 1、5 和 6。

这一切看起来像是很多样板文件,它们几乎必须绕过 COM 中的每个函数调用。

我知道 MSVC++ 编译器提供了一大堆东西来简化 COM 的操作,例如 ATL 和编译器特定的 COM 扩展 _com_error , _com_raise_error和类似的,但我不确定如何使用它们,或者它们是否打算由用户代码使用。

是否有任何典型策略用于以异常安全和竞争条件安全的方式管理这种复杂性?

最佳答案

“显而易见”的解决方案是 ComException。它几乎可以处理所有步骤 - 您只需要获取构造函数的 HRESULT 并抛出结果对象(步骤 1 和 7)。

你甚至可以写

HRESULT check(HRESULT hr)
{
if(FAILED(hr)) throw ComException(hr);
return hr; // Success comes in different forms.
}

为您处理第 7 步。例如。 check(pUnk->QueryInterface(MyID, &pMyIf));

关于c++ - 在 C++ 中调用 COM 时如何包装错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10167487/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com