Quando restituisce E_POINTER e quando E_INVALIDARG?
-
07-07-2019 - |
Domanda
??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?
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 :)