Pregunta

Los

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?

¿Fue útil?

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 :)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top