Partager via


INonDelegatingUnknown

[La fonctionnalité associée à cette page, DirectShow, est une fonctionnalité héritée. Il a été remplacé par MediaPlayer, IMFMediaEngine et Audio/Video Capture in Media Foundation. Ces fonctionnalités ont été optimisées pour Windows 10 et Windows 11. Microsoft recommande vivement que le nouveau code utilise MediaPlayer, IMFMediaEngine et Audio/Video Capture dans Media Foundation au lieu de DirectShow, si possible. Microsoft suggère que le code existant qui utilise les API héritées soit réécrit pour utiliser les nouvelles API si possible.]

L’interface INonDelegatingUnknown est une version d’IUnknown qui est renommée pour permettre la prise en charge des interfaces IUnknown de non-suppression et de délégation dans le même objet COM.

Syntaxe

interface INonDelegatingUnknown
{
    virtual HRESULT NonDelegatingQueryInterface(REFIID riid, LPVOID *ppv) PURE;
    virtual ULONG NonDelegatingAddRef(void) PURE;
    virtual ULONG NonDelegatingRelease(void) PURE;
};

Notes

Pour utiliser INonDelegatingUnknown pour plusieurs héritages, procédez comme suit.

  1. Dérivez votre classe d’une interface, par exemple IMyInterface.

  2. Incluez DECLARE_IUNKNOWN dans votre définition de classe pour déclarer les implémentations de QueryInterface, AddRef et Release qui appellent l’inconnu externe.

  3. Remplacez NonDelegatingQueryInterface pour exposer IMyInterface avec du code tel que le suivant :

         if (riid == IID_IMyInterface) {
             return GetInterface((IMyInterface *) this, ppv);
         } else {
             return CUnknown::NonDelegatingQueryInterface(riid, ppv);
         }
    
  4. Déclarez et implémentez les fonctions membres de IMyInterface.

Pour utiliser pour les INonDelegatingUnknown interfaces imbriquées, procédez comme suit :

  1. Déclarez une classe dérivée de CUnknown.

  2. Incluez DECLARE_IUNKNOWN dans votre définition de classe.

  3. Remplacez NonDelegatingQueryInterface pour exposer IMyInterface avec le code tel que le suivant :

         if (riid == IID_IMyInterface) {
             return GetInterface((IMyInterface *) this, ppv);
         } else {
             return CUnknown::NonDelegatingQueryInterface(riid, ppv);
         }
    
  4. Implémentez les fonctions membres de IMyInterface. Utilisez CUnknown::GetOwner pour accéder à la classe d’objet COM.

  5. Dans votre classe d’objet COM, faites de la classe imbriquée un ami de la classe d’objet COM et déclarez un instance de la classe imbriquée en tant que membre de la classe d’objet COM.

Étant donné que vous devez toujours passer l’inconnu externe et un HRESULT au constructeur CUnknown , vous ne pouvez pas utiliser un constructeur par défaut. Vous devez faire de la variable membre un pointeur vers la classe et effectuer un nouvel appel dans votre constructeur pour la créer réellement.

Remplacez nonDelegatingQueryInterface par du code tel que le suivant :

     if (riid == IID_IMyInterface) {
         return m_pImplFilter->
            NonDelegatingQueryInterface(IID_IMyInterface, ppv);
     } else {
         return CUnknown::NonDelegatingQueryInterface(riid, ppv);
     }

Vous pouvez avoir des classes mixtes qui prennent en charge certaines interfaces via plusieurs héritages et certaines interfaces par le biais de classes imbriquées.

Configuration requise

Condition requise Valeur
En-tête
Combase.h (include Streams.h)
Bibliothèque
Strmbase.lib (builds de vente au détail) ;
Strmbasd.lib (builds de débogage)

Voir aussi

Fonctions d’assistance COM