4

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

4

2 回答 2

6

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

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
  }
}
于 2013-09-25T05:58:38.447 回答
0

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

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

于 2013-09-25T05:45:34.517 回答