Question

Les méthodes d'interface

COM peuvent renvoyer diverses valeurs HRESULT pour signaler les valeurs d'argument non valides passées. Quand dois-je retourner E_POINTER et quand E_INVALIDARG ?

Si j'ai bien compris, si une méthode reçoit un index dans une collection encapsulée et qu'il est hors limites, il est E_INVALIDARG . Si une méthode reçoit un pointeur Interface ** , elle est destinée à stocker un pointeur sur un objet nouvellement créé qui est 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;
}

Mais que se passe-t-il s’il reçoit un tampon WCHAR * avec un nom de fichier sous la forme " in " paramètre et ce WCHAR * est nul? S'agit-il de E_POINTER ou de E_INVALIDARG ?

Ou une méthode reçoit un pointeur sur une structure et doit remplir cette structure par l'intermédiaire de ce pointeur. Ce pointeur est null. Ce code est-il 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 à respecter pour le renvoi E_POINTER et le E_INVALIDARG lors de la vérification des paramètres de type pointeur?

Était-ce utile?

La solution

Vous renvoyez E_POINTER lorsque la référence au pointeur d'un paramètre out est null, il s'agit d'un code d'erreur indiquant un bogue dans le programme ou dans le programme. couche interop.

Vous renvoyez E_INVALIDARG lorsqu'un niveau d'application est activé avec le paramètre, par exemple un problème hors de portée ou un paramètre en conflit.

Dans votre cas, dans SaveToFile (...) , vous devez renvoyer E_INVLIADARARG car il n'est pas valide pour transmettre un nom de fichier vide, et dans GetAttributes ( ...) vous devriez retourner E_POINTER (s'il s'agit d'un paramètre out) car vous ne pouvez pas renseigner la valeur.

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top