2009-09-15 7 views
8

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?

Répondre

9

Vous revenez E_POINTER lorsque la référence au pointeur d'un paramètre sur est nul, ce considérer comme un code d'erreur qui indique un bogue dans le programme ou dans la couche Interop.

Vous renvoyez E_INVALIDARG lorsqu'un niveau d'application est défini sur le paramètre, par exemple un problème hors de portée ou un paramètre qui entre en collision.

Dans votre cas, vous devez retourner SaveToFile(...)E_INVLIADARG car il n'est pas valide pour passer le nom de fichier vide, et GetAttributes(...) vous devez retourner E_POINTER (si elle est un hors param) parce que vous ne pouvez pas remplir la valeur.

Et oui, nous tous L-O-V-E com :)

+0

Avez-vous des références de documents? – Constantin

+0

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. –

+0

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. –