valores todas tipos retorno programacion las funciones funcion ejemplos ejemplo con c++ com atl hresult queryinterface

c++ - todas - Manejo del valor de retorno de CoCreateInstance



valores de retorno en programacion (2)

Al obtener el resultado S_OK de CoCreateInstance , se garantiza que obtendrá un puntero de interfaz que no sea NULL , por lo que no es necesario que lo compruebe adicionalmente. Para que sea más confiable y pueda detectar problemas con anticipación, es posible que desee utilizar ATLASSERT para comparar con NULL . Esto no produce código en compilaciones de lanzamiento, pero genera una advertencia temprana en la depuración si algo sale mal (especialmente edita o copia el código de pegado más tarde y cambia la lógica para obtener el puntero).

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

Aquí hay un ejemplo de código que crea un objeto COM:

CComPtr<IBaseFilter> pFilter; auto hr = CoCreateInstance(CLSID_DMOWrapperFilter, NULL, CLSCTX_INPROC_SERVER, IID_IBaseFilter, reinterpret_cast<void**>(&pFilter));

He visto en alguna parte que verificar si CoCreateInstance() tuvo éxito debería verse así:

if (SUCCEEDED(hr) && pFilter != nullptr) { // code goes here }

¿Qué pasa si solo hr ? ¿No sería suficiente? ¿Debería también verificar ese filter != nullptr ?

//would this be enough? if (SUCCEEDED(hr)) { // code goes here }

Esta pregunta también se refiere a otros métodos COM como QueryInterface() .


Creo que es redundante y no es necesario verificar ambos.

Sin embargo, si falla, el valor de retorno le dirá qué error ocurrió. Es por eso que hay 2 formas de determinar si la función tuvo éxito o no.