次の方法で共有


INonDelegatingUnknown

INonDelegatingUnknown インターフェイスは、同じ COM オブジェクトの非委任および委任 IUnknown インターフェイスの両方のサポートを有効にするために名前を変更した 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. 外部 unknown を呼び出す QueryInterfaceAddRef、および Release の実装を宣言するため、クラス定義に DECLARE_IUNKNOWN をインクルードする。

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

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

ネストしたインターフェイスで 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 オブジェクト クラスのメンバとして宣言する。

外部 unknown と HRESULT は必ず CUnknown コンストラクタに渡さなければならないので、デフォルトのコンストラクタは使えない。メンバ変数をクラスへのポインタとし、コンストラクタで新しい呼び出しを行って、実際に作成する必要がある。

次のようなコードを使って、NonDelegatingQueryInterface をオーバーライドする。

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

複数の継承およびネストしたクラスによって、一部のインターフェイスをサポートする混合クラスを持つことができる。

参照

COM ヘルパー関数