Question

Un paramètre void ** est attribué à IUnknown :: QueryInterface (), indiquant une adresse où placer l'interface récupérée.

STDMETHOD QueryInterface(/* [in] */ REFIID riid, /* [iid_is][out] */ void** ppvObject)

L'implémentation de QueryInterface () doit-elle vérifier si ce pointeur est null (puis renvoyer immédiatement E_POINTER) ou simplement y écrire?

J'ai vu beaucoup de code lié à COM et pratiquement aucun contrôle n'est effectué. En théorie, quelqu'un pourrait bien passer le pointeur null comme paramètre, mais une telle vérification est-elle vraiment nécessaire?

Était-ce utile?

La solution

Vous (l'appelant) n'avez pas besoin de vérifier si le pointeur n'est pas NULL .

Cependant, vous devez vérifier le HRESULT renvoyé. La méthode renverra E_POINTER si le pointeur de sortie est NULL et E_NOINTERFACE si l'interface n'est pas prise en charge.

L'appelé doit vérifier si le pointeur n'est pas NULL et renvoyer E_POINTER s'il est NULL :

  

MSDN : valeur renvoyée:

     

Cette méthode retourne S_OK si l'interface est prise en charge et E_NOINTERFACE dans le cas contraire. Si ppvObject est NULL , cette méthode retourne E_POINTER .

Autres conseils

Selon les documents MSDN , QueryInterface renvoie S_OK, auquel cas le paramètre out sera défini correctement. Ou il renvoie E_NOINTERFACE, auquel cas le paramètre out ne sera pas défini.

Il retournera E_POINTER si le vide ** que vous transmettez est NULL.

Je ne voudrais pas chercher la valeur null, mais plutôt la valeur renvoyée par IUnknown :: QueryInterface

Il n’ya probablement aucun inconvénient à vérifier la valeur null, mais compte tenu des garanties de l’interface, cela ressemble à une vérification redondante.

Cela dépend du type d’objet COM que vous utilisez (ou de l’application qui vous héberge). La plupart du temps, vérifier le HRESULT devrait suffire. Si vous traitez avec des objets tiers (remplacement de l'explorateur, etc.), vous devriez probablement également rechercher la valeur NULL. Explorer le fait, et vous devez donc également savoir si vous voulez éviter les plantages dans les extensions boguées:

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