2009-09-15 6 views
8

I metodi di interfaccia COM possono restituire vari valori HRESULT per segnalare valori di argomenti non validi passati. Quando restituisco E_POINTER e quando E_INVALIDARG?Quando si restituisce E_POINTER e quando E_INVALIDARG?

Come ho capito se un metodo riceve un indice in una raccolta incapsulata ed è fuori limite che è E_INVALIDARG. Se un metodo riceve un puntatore Interface** dove si intende 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 si riceve un buffer WCHAR* con un nome di file come "in" parametri e questo WCHAR* è nullo? È questo E_POINTER o E_INVALIDARG?

Oppure un metodo riceve un puntatore su una struttura e ci si aspetta che riempia la struttura attraverso quel puntatore e questo puntatore sia 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 tornare E_POINTER e quando E_INVALIDARG durante il controllo i parametri di tipo puntatore?

risposta

9

È tornare E_POINTER quando il riferimento al puntatore di un parametro out è nullo, questo ritengo essere un codice di errore che indica un bug nel programma o nel livello di interoperabilità.

Si restituisce E_INVALIDARG quando è presente un livello applicazione con il parametro, ad esempio un problema fuori intervallo o un parametro che si scontrano tra loro.

Nel tuo caso, in SaveToFile(...) si dovrebbe tornare E_INVLIADARG dal momento che non è valido per passare il nome file vuoto, e in GetAttributes(...) si dovrebbe tornare E_POINTER (se si tratta di un parametro out) perché non si può riempire il valore.

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

+0

Avete riferimenti doc? – Constantin

+0

concordato. Mi piacerebbe davvero vedere un riferimento MSDN per questo. Quanto sopra ha un qualche senso, ma sarebbe bello avere la difesa canonica. –

+0

Non sono sicuro che questa risposta sia corretta. Ad esempio, in VS2010 '', nell'implementazione 'AtlSetChildSite()', viene restituito 'E_POINTER' se il parametro' punkChild' è 'NULL', invece in base a questa risposta (se ho capito bene),' E_INVALIDARG 'avrebbe dovuto essere restituito in quel caso. Penso che ATL sia una buona fonte di buone pratiche di programmazione COM, quindi forse 'E_POINTER' dovrebbe essere restituito nei casi generali di puntatori non validi (ad esempio' NULL'). Ma francamente non ne sono sicuro, e sono d'accordo che alcuni riferimenti ufficiali MSDN sarebbero buoni. –