处理共同创建实例返回值



下面是创建 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()

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
  }
}

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

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

相关内容

  • 没有找到相关文章

最新更新