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.