2009-05-04 14 views
1

Officiellement, il ne faut pas utiliser les paramètres [out] des fonctions COM à moins que la fonction réussisse, cela signifie qu'il y a (au moins) trois façons de voir si un paramètre [out] peut être utilisé.Comment vérifier que [out] params dans COM peut être utilisé?

Tenir compte l'interface suivante

interface IFoo : IUnknown { 
    HRESULT GetOtherFoo([out] IFoo** ppFoo); 
    HRESULT Bar(); 
}; 

Laquelle des façons suivantes recommanderiez-vous l'utiliser?

1. Vérifiez la valeur de retour

CComPtr<IFoo> other; 
HRESULT hr = foo->GetOtherFoo(&other); 
if (SUCCEEDED(hr)) 
    other->Bar(); 

Cela me rend un peu nerveux car un bogue dans IFoo pourrait provoquer un pointeur NULL déréférencement.

2. Vérifiez le paramètre de sortie

Cela dépend du fait que si une méthode échoue, il ne doit pas modifier les paramètres [out] (si le paramètre a changé < ==> il est sûr de l'utiliser).

CComPtr<IFoo> other; 
foo->GetOtherFoo(&other); 
if (other) 
    other->Bar(); 

Notez que cela se produit en quelque sorte de toute façon, destructor l » CComPtr appellera Release si le pointeur ne NULL donc il ne peut pas être ordures.

3. La façon paranoïaque, vérifier les deux

CComPtr<IFoo> other; 
HRESULT hr = foo->GetOtherFoo(&other); 
if (SUCCEEDED(hr) && other) 
    other->Bar(); 

C'est un peu bavard à mon avis.


P.S. Voir related question.

Répondre

2

Si vous souhaitez écrire plus de chèques et rendre le code un peu plus lent pour le rendre plus fiable, l'option 3 est pour vous. Puisque vous vous attendez à ce qu'il y ait des bogues dans le serveur COM, il est tout à fait raisonnable de les vérifier.

2

Les méthodes de serveur COM qui renvoient un succès HRESULT, tout en définissant certains de leurs paramètres de sortie sur NULL, ne sont pas très courantes. Il y a quelques cas (IClientSecurity :: QueryBlanket vient à l'esprit) où cela est utilisé, mais habituellement le client peut s'attendre à ce que tous les paramètres de sortie soient non-NULL si la méthode est retournée avec succès.

Après tout, c'est une question de comment la méthode est documentée. Dans le cas par défaut, cependant, je considérerais 1. être un moyen sûr d'aller.

Questions connexes