Domanda

I metodi

??interfacce COM possono restituire vari valori HRESULT per segnalare valori di argomenti non validi passati. Quando restituisco E_POINTER e quando E_INVALIDARG ?

Come ho capito se un metodo riceve un indice in una raccolta incapsulata ed è fuori dai limiti che è E_INVALIDARG . Se un metodo riceve un puntatore Interface ** in cui è destinato a memorizzare un puntatore a un oggetto appena creato che è 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;
}

Ma cosa succede se riceve un buffer WCHAR * con un nome file come " in " parametro e questo WCHAR * è null? Questo E_POINTER o E_INVALIDARG ?

O un metodo riceve un puntatore a qualche struttura e si prevede che riempia la struttura attraverso quel puntatore e questo puntatore è nullo - è questo 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;
}

Quali sono le regole per quando restituire E_POINTER e quando E_INVALIDARG quando si controllano i parametri del tipo di puntatore?

È stato utile?

Soluzione

Restituisci E_POINTER quando il riferimento al puntatore di un parametro out è nullo, questo considera un codice di errore che indica un bug nel programma o nel strato di interoperabilità.

Restituisci E_INVALIDARG quando esiste un livello di applicazione attivo con il parametro, ad esempio problema fuori portata o parametro che si scontrano tra loro.

Nel tuo caso, in SaveToFile (...) dovresti restituire E_INVLIADARG poiché non è valido per passare un nome file vuoto e in GetAttributes ( ...) dovresti restituire E_POINTER (se è un parametro out) perché non puoi riempire il valore.

E sì, siamo tutti L-O-V-E com :)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top