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?
Avete riferimenti doc? – Constantin
concordato. Mi piacerebbe davvero vedere un riferimento MSDN per questo. Quanto sopra ha un qualche senso, ma sarebbe bello avere la difesa canonica. –
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. –