INonDelegatingUnknown

[このページに関連付けられている機能 DirectShow は、従来の機能です。 MediaPlayer、IMFMediaEngine、Media Foundation のオーディオ/ビデオ キャプチャに置き換わりました。 これらの機能は、Windows 10とWindows 11用に最適化されています。 新しいコードでは、可能であれば、DirectShow ではなく Media Foundation で MediaPlayerIMFMediaEngineAudio/Video Capture を使用することを強くお勧めします。 Microsoft は、レガシ API を使用する既存のコードを、可能であれば新しい API を使用するように書き換えるよう提案しています。]

インターフェイスは INonDelegatingUnknownIUnknown のバージョンであり、同じ COM オブジェクト内の IUnknown インターフェイスの非削除と委任の両方をサポートできるように名前が変更されています。

構文

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

解説

を複数の継承に使用 INonDelegatingUnknown するには、次の手順を実行します。

  1. インターフェイス (IMyInterface など) からクラスを派生させます。

  2. クラス定義 にDECLARE_IUNKNOWN を含め、外部不明を呼び出す QueryInterfaceAddRefRelease の実装を宣言します。

  3. NonDelegatingQueryInterface をオーバーライドして、IMyInterface を次のようなコードで公開します。

         if (riid == IID_IMyInterface) {
             return GetInterface((IMyInterface *) this, ppv);
         } else {
             return CUnknown::NonDelegatingQueryInterface(riid, ppv);
         }
    
  4. IMyInterface のメンバー関数を宣言して実装します。

入れ子になったインターフェイスに を使用 INonDelegatingUnknown するには、次の手順を実行します。

  1. CUnknown から派生したクラスを宣言します。

  2. クラス定義 にDECLARE_IUNKNOWN を含めます。

  3. NonDelegatingQueryInterface をオーバーライドして、次のようなコードで IMyInterface を公開します。

         if (riid == IID_IMyInterface) {
             return GetInterface((IMyInterface *) this, ppv);
         } else {
             return CUnknown::NonDelegatingQueryInterface(riid, ppv);
         }
    
  4. IMyInterface のメンバー関数を実装します。 CUnknown::GetOwner を使用して COM オブジェクト クラスにアクセスします。

  5. COM オブジェクト クラスで、入れ子になったクラスを COM オブジェクト クラスのフレンドにし、入れ子になったクラスのインスタンスを COM オブジェクト クラスのメンバーとして宣言します。

外側の不明なコンストラクターと HRESULTCUnknown コンストラクターに常に渡す必要があるため、既定のコンストラクターを使用することはできません。 メンバー変数を クラスへのポインターにし、コンストラクターで新しい呼び出しを行って実際に作成する必要があります。

NonDelegatingQueryInterface を次のようなコードでオーバーライドします。

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

複数の継承を介して一部のインターフェイスをサポートする混合クラスと、入れ子になったクラスを介した一部のインターフェイスを持つことができます。

要件

要件
ヘッダー
Combase.h (Streams.h を含む)
ライブラリ
Strmbase.lib (製品版ビルド);
Strmbasd.lib (デバッグ ビルド)

関連項目

COM ヘルパー関数