Обработка возвращаемого значения CoCreateInstance

Вот пример кода для создания 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(),

2 ответа

Решение

Имеющий 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
  }
}

Я думаю, что это избыточно и не нужно проверять оба.

Если это произойдет, однако, возвращаемое значение сообщит вам, какая ошибка произошла. Вот почему есть 2 способа определить, была ли функция успешной или нет.

Другие вопросы по тегам