Est-il utile de vérifier le pointeur null dans l'implémentation QueryInterface ()?
-
07-07-2019 - |
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?
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 etE_NOINTERFACE
dans le cas contraire. SippvObject
estNULL
, cette méthode retourneE_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: