INonDelegatingUnknown

[La funzionalità associata a questa pagina, DirectShow, è una funzionalità legacy. È stata sostituita da MediaPlayer, IMFMediaEngine e Audio/Video Capture in Media Foundation. Queste funzionalità sono state ottimizzate per Windows 10 e Windows 11. Microsoft consiglia vivamente che il nuovo codice usi MediaPlayer, IMFMediaEngine e Audio/Video Capture in Media Foundation invece di DirectShow, quando possibile. Microsoft suggerisce che il codice esistente che usa le API legacy venga riscritto per usare le nuove API, se possibile.

L'interfaccia INonDelegatingUnknown è una versione di IUnknown rinominata per abilitare il supporto sia per la mancata delega delle interfacce IUnknown nello stesso oggetto COM.

Sintassi

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

Osservazioni

Per usare INonDelegatingUnknown per più ereditarietà, seguire questa procedura.

  1. Derivare la classe da un'interfaccia, ad esempio IMyInterface.

  2. Includere DECLARE_IUNKNOWN nella definizione della classe per dichiarare le implementazioni di QueryInterface, AddRef e Release che chiamano l'elemento sconosciuto esterno.

  3. Eseguire l'override di NonDelegatingQueryInterface per esporre IMyInterface con codice come il seguente:

         if (riid == IID_IMyInterface) {
             return GetInterface((IMyInterface *) this, ppv);
         } else {
             return CUnknown::NonDelegatingQueryInterface(riid, ppv);
         }
    
  4. Dichiarare e implementare le funzioni membro di IMyInterface.

Per usare INonDelegatingUnknown per le interfacce annidate, seguire questa procedura:

  1. Dichiarare una classe derivata da CUnknown.

  2. Includere DECLARE_IUNKNOWN nella definizione della classe.

  3. Eseguire l'override di NonDelegatingQueryInterface per esporre IMyInterface con il codice, ad esempio:

         if (riid == IID_IMyInterface) {
             return GetInterface((IMyInterface *) this, ppv);
         } else {
             return CUnknown::NonDelegatingQueryInterface(riid, ppv);
         }
    
  4. Implementare le funzioni membro di IMyInterface. Usare CUnknown::GetOwner per accedere alla classe di oggetti COM.

  5. Nella classe oggetto COM rendere la classe annidata un amico della classe oggetto COM e dichiarare un'istanza della classe annidata come membro della classe oggetto COM.

Poiché è sempre necessario passare l'elemento sconosciuto esterno e un HRESULT al costruttore CUnknown , non è possibile usare un costruttore predefinito. È necessario impostare la variabile membro come puntatore alla classe e effettuare una nuova chiamata nel costruttore per crearla effettivamente.

Eseguire l'override di NonDelegatingQueryInterface con codice simile al seguente:

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

È possibile avere classi miste che supportano alcune interfacce tramite più ereditarietà e alcune interfacce tramite classi annidate.

Requisiti

Requisito Valore
Intestazione
Combase.h (include Streams.h)
Libreria
Strmbase.lib (build retail);
Strmbasd.lib (build di debug)

Vedi anche

Funzioni helper COM