【问题标题】:Handling CoCreateInstance return value处理 CoCreateInstance 返回值
【发布时间】:2013-09-30 13:53:35
【问题描述】:

这是一个创建 COM 对象的代码示例:

CComPtr<IBaseFilter> pFilter;
auto hr = CoCreateInstance(CLSID_DMOWrapperFilter, NULL,
    CLSCTX_INPROC_SERVER, IID_IBaseFilter, reinterpret_cast<void**>(&pFilter));

我在某处看到检查CoCreateInstance() 是否成功应该是这样的:

if (SUCCEEDED(hr) && pFilter != nullptr)
{
  // code goes here
}

如果我只检查hr 会怎样?还不够吗?我还应该检查filter != nullptr吗?

//would this be enough?
if (SUCCEEDED(hr))
{
  // code goes here
}

这个问题还涉及其他 COM 方法,例如 QueryInterface()

【问题讨论】:

标签: c++ com atl hresult queryinterface


【解决方案1】:

CoCreateInstance 得到S_OK 的结果,你肯定会得到一个非NULL 的接口指针,所以你不需要额外检查它。为了使其更可靠并能够及早发现问题,您可能希望在此处使用ATLASSERTNULL 进行比较。这不会在发布版本中生成代码,但如果出现任何问题(尤其是您稍后编辑或复制粘贴代码并更改获取指针的逻辑),则会在调试中生成早期警告。

CComPtr<IBaseFilter> pFilter;
HRESULT hr = CoCreateInstance(CLSID_DMOWrapperFilter, NULL, CLSCTX_INPROC_SERVER,
  IID_IBaseFilter, reinterpret_cast<VOID**>(&pFilter));
if(SUCCEEDED(hr))
{
  ATLASSERT(pFilter); // hr is of the interest because might explain failure
                      // pFilter is expected to be non-NULL in case of S_OK
  const CComQIPtr<IDMOWrapperFilter> pDmoWrapperFilter = pFilter;
  if(pDmoWrapperFilter)
  {
    // We're not really interested in QueryInterface's HRESULT since it's
    // either S_OK or E_NOINTERFACE, hr will typically explain nothing special.
    // More important is whether we finally obtained the pointer or not
  }
}

【讨论】:

  • +1 表示断言。我很少调试代码——我让代码自己调试。与必须操作调试器的其他人相比,我有更多的空闲时间......
【解决方案2】:

我认为这是多余的,不需要同时检查。

如果它确实失败了,返回值会告诉你发生了哪个错误。这就是为什么有两种方法可以确定函数是否成功。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-02
    • 2011-05-08
    • 1970-01-01
    • 2020-12-28
    • 1970-01-01
    • 2011-02-20
    • 2016-07-10
    • 1970-01-01
    相关资源
    最近更新 更多