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.