Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Il existe trois règles principales qui régissent l’implémentation de la méthode IUnknown ::QueryInterface sur un objet COM :
- Les objets doivent avoir une identité.
- L’ensemble d’interfaces sur une instance d’objet doit être statique.
- Il doit être possible d’interroger correctement n’importe quelle interface sur un objet à partir d’une autre interface.
Les objets doivent avoir une identité
Pour une instance d’objet donnée, un appel à QueryInterface avec IID_IUnknown doit toujours retourner la même valeur de pointeur physique. Cela vous permet d’appeler QueryInterface sur deux interfaces et de comparer les résultats pour déterminer s’ils pointent vers la même instance d’un objet.
L’ensemble d’interfaces sur une instance d’objet doit être statique
L’ensemble d’interfaces accessibles sur un objet via QueryInterface doit être statique, et non dynamique. Plus précisément, si QueryInterface retourne S_OK pour un IID donné une fois, il ne doit jamais retourner E_NOINTERFACE sur les appels suivants sur le même objet ; et si QueryInterface retourne E_NOINTERFACE pour un IID donné, les appels suivants pour le même IID sur le même objet ne doivent jamais retourner S_OK.
Il doit être possible d’interroger correctement n’importe quelle interface sur un objet à partir d’une autre interface
Autrement dit, étant donné le code suivant :
IA * pA = (some function returning an IA *);
IB * pB = NULL;
HRESULT hr;
hr = pA->QueryInterface(IID_IB, &pB);
les règles suivantes s’appliquent :
Si vous avez un pointeur vers une interface sur un objet, un appel semblable à ce qui suit pour QueryInterface pour cette même interface doit réussir :
pA->QueryInterface(IID_IA, ...)Si un appel à QueryInterface pour un deuxième pointeur d’interface réussit, un appel à queryInterface à partir de ce pointeur pour la première interface doit également réussir. Si pB a été obtenu avec succès, les éléments suivants doivent également réussir :
pB->QueryInterface(IID_IA, ...)Toute interface doit être en mesure d’interroger toute autre interface sur un objet. Si pB a été obtenu avec succès et que vous interrogez correctement une troisième interface (IC) à l’aide de ce pointeur, vous devez également être en mesure d’interroger avec succès pour IC à l’aide du premier pointeur, pA. Dans ce cas, la séquence suivante doit réussir :
IC * pC = NULL; hr = pB->QueryInterface(IID_IC, &pC); pA->QueryInterface(IID_IC, ...)
Les implémentations d’interface doivent conserver un compteur de références de pointeur en attente à toutes les interfaces d’un objet donné. Vous devez utiliser un entier non signé pour le compteur.
Si un client doit savoir que les ressources ont été libérées, elle doit utiliser une méthode dans une interface sur l’objet avec une sémantique de niveau supérieur avant d’appeler IUnknown ::Release.
Rubriques connexes