Обработка возвращаемого значения 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(),

4

Решение

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

Другие решения

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

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

0

По вопросам рекламы [email protected]