Les méthodes d'interface COM peuvent renvoyer diverses valeurs HRESULT
pour signaler des valeurs d'argument non valides transmises. Quand dois-je retourner E_POINTER
et quand E_INVALIDARG
? Comme je comprends si une méthode reçoit un index dans une collection encapsulée et qu'il est hors limites, c'est E_INVALIDARG
. Si une méthode reçoit un pointeur Interface**
où il est destiné à stocker un pointeur vers un objet nouvellement créé E_POINTER
.Lorsque retourner E_POINTER et quand E_INVALIDARG?
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;
}
Mais que si elle reçoit un tampon WCHAR*
avec un nom de fichier en tant que « dans » paramètre et ce WCHAR*
est nul? Est-ce E_POINTER
ou E_INVALIDARG
?
Ou une méthode reçoit un pointeur vers une structure et devrait remplir la structure à travers ce pointeur et ce pointeur est nul - est-ce E_POINTER
ou 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;
}
Quelles sont les règles pour le moment de revenir E_POINTER
et quand E_INVALIDARG
lors de la vérification des paramètres de type pointeur?
Avez-vous des références de documents? – Constantin
D'accord. J'aimerais vraiment voir une référence MSDN pour cela. Ce qui précède a un sens, mais il serait bon d'avoir la défaite canonique. –
Je ne suis pas sûr que cette réponse soit correcte. Par exemple, dans VS2010 '', dans l'implémentation 'AtlSetChildSite()', 'E_POINTER' est renvoyé si le paramètre 'punkChild' est' NULL', mais selon cette réponse (si je l'ai bien compris), 'E_INVALIDARG 'aurait dû être retourné dans ce cas. Je pense que ATL est une bonne source de bonnes pratiques de programmation COM, donc peut-être 'E_POINTER' devrait être retourné dans les cas généraux de pointeurs invalides (par exemple' NULL'). Mais franchement, je ne suis pas sûr non plus, et je suis d'accord qu'une référence officielle de MSDN serait bonne. –