Freigeben über


INonDelegatingUnknown

[Das dieser Seite zugeordnete Feature DirectShow ist ein Legacyfeature. Es wurde durch MediaPlayer, IMFMediaEngine und Audio/Video Capture in Media Foundation ersetzt. Diese Features wurden für Windows 10 und Windows 11 optimiert. Microsoft empfiehlt dringend, dass neuer Code nach Möglichkeit MediaPlayer, IMFMediaEngine und Audio/Video Capture in Media Foundation anstelle von DirectShow verwendet. Microsoft schlägt vor, vorhandenen Code, der die Legacy-APIs verwendet, um nach Möglichkeit die neuen APIs zu verwenden.]

Die INonDelegatingUnknown Schnittstelle ist eine Version von IUnknown , die umbenannt wird, um die Unterstützung für nicht delegierende und delegierende IUnknown-Schnittstellen im selben COM-Objekt zu ermöglichen.

Syntax

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

Bemerkungen

Führen Sie die folgenden Schritte aus, um sie für die mehrfache Vererbung zu verwenden INonDelegatingUnknown .

  1. Leiten Sie Ihre Klasse von einer Schnittstelle ab, z. B. IMyInterface.

  2. Schließen Sie DECLARE_IUNKNOWN in Ihre Klassendefinition ein, um Implementierungen von QueryInterface, AddRef und Release zu deklarieren, die das äußere Unbekannte aufrufen.

  3. Überschreiben Sie NonDelegatingQueryInterface , um IMyInterface mit Code wie dem folgenden verfügbar zu machen:

         if (riid == IID_IMyInterface) {
             return GetInterface((IMyInterface *) this, ppv);
         } else {
             return CUnknown::NonDelegatingQueryInterface(riid, ppv);
         }
    
  4. Deklarieren und implementieren Sie die Memberfunktionen von IMyInterface.

Führen Sie zum Verwenden INonDelegatingUnknown für geschachtelte Schnittstellen die folgenden Schritte aus:

  1. Deklarieren Sie eine von CUnknown abgeleitete Klasse.

  2. Schließen Sie DECLARE_IUNKNOWN in Ihre Klassendefinition ein.

  3. Überschreiben Sie NonDelegatingQueryInterface , um IMyInterface mit dem folgenden Code verfügbar zu machen:

         if (riid == IID_IMyInterface) {
             return GetInterface((IMyInterface *) this, ppv);
         } else {
             return CUnknown::NonDelegatingQueryInterface(riid, ppv);
         }
    
  4. Implementieren Sie die Memberfunktionen von IMyInterface. Verwenden Sie CUnknown::GetOwner , um auf die COM-Objektklasse zuzugreifen.

  5. Machen Sie in Ihrer COM-Objektklasse die geschachtelte Klasse zu einem Freund der COM-Objektklasse, und deklarieren Sie einen instance der geschachtelten Klasse als Member der COM-Objektklasse.

Da Sie immer das äußere Unbekannte und ein HRESULT an den CUnknown-Konstruktor übergeben müssen, können Sie keinen Standardkonstruktor verwenden. Sie müssen die Membervariable als Zeiger auf die -Klasse festlegen und einen neuen Aufruf in Ihrem Konstruktor tätigen, um sie tatsächlich zu erstellen.

Überschreiben Sie nonDelegatingQueryInterface mit Code wie dem folgenden:

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

Sie können gemischte Klassen haben, die einige Schnittstellen durch mehrere Vererbung und einige Schnittstellen über geschachtelte Klassen unterstützen.

Anforderungen

Anforderung Wert
Header
Combase.h (Streams.h einschließen)
Bibliothek
Strmbase.lib (Einzelhandelsbuilds);
Strmbasd.lib (Debugbuilds)

Siehe auch

COM-Hilfsfunktionen