¿Cuándo devolver E_POINTER y cuando E_INVALIDARG?
-
07-07-2019 - |
Pregunta
métodos de interfaces COM pueden devolver varios valores de HRESULT
para indicar que se pasan valores de argumento no válidos. ¿Cuándo devuelvo E_POINTER
y cuándo E_INVALIDARG
?
Según tengo entendido, si un método recibe un índice en una colección encapsulada y está fuera de los límites es E_INVALIDARG
. Si un método recibe un puntero Interface **
donde está destinado a almacenar un puntero a un objeto recién creado que es E_POINTER
.
HRESULT CImpl::GetItem( long index; Interface** result )
{
if( result == 0 ) {
return E_POINTER;
}
if( index < 0 || index >= internalArray.size() ) {
return E_INVALIDARG;
}
*result = CreateWrapperObject( internalArray[index] );
return S_OK;
}
Pero, ¿qué pasa si recibe un búfer WCHAR *
con un nombre de archivo como " en " parámetro y este WCHAR *
es nulo? ¿Es este E_POINTER
o E_INVALIDARG
?
O un método recibe un puntero a alguna estructura y se espera que complete la estructura a través de ese puntero y este puntero es nulo: ¿es este E_POINTER
o E_INVALIDARG
?
HRESULT CImpl::SaveToFile( WCHAR* fileName )
{
if( fileName == 0 ) {
return // what to return here?
}
//... do actual work here
}
HRESULT CImpl::GetAttributes( Attributes* to )
{
if( to == 0 ) {
return // what to return here?
}
attributes->IsCool = getIsCool();
attributes->Color = RGB( 0, 255, 0 );
return S_OK;
}
¿Cuáles son las reglas para cuándo devolver E_POINTER
y cuándo E_INVALIDARG
al verificar los parámetros de tipo de puntero?
Solución
Devuelve E_POINTER
cuando la referencia al puntero de un parámetro out es nulo, esto se considera un código de error que indica un error en el programa o en el capa de interoperabilidad.
Devuelve E_INVALIDARG
cuando hay un nivel de aplicación activado con el parámetro, por ejemplo, problema de fuera de rango o parámetro que colisionan entre sí.
En su caso, en SaveToFile (...)
debe devolver E_INVLIADARG
ya que no es válido pasar un nombre de archivo vacío y en GetAttributes ( ...)
debe devolver E_POINTER
(si es un parámetro fuera) porque no puede completar el valor.
Y sí, todos somos L-O-V-E com :)