2013-09-25 7 views
4

Вот пример кода создания COM-объекта:Обработка возвращаемого значения CoCreateInstance

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().

+0

Похожие:.. Http://stackoverflow.com/q/25325891/57428 – sharptooth

ответ

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

Спасибо за замечание о HRESULT! QueryInterface! – Dalamber

+0

+1 для утверждения. Я редко отлаживаю код - я позволяю самому отлаживать код. У меня есть гораздо больше свободного времени, чем другие, которым приходится работать с отладчиком .... – jww

0

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

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

Смежные вопросы