Microsoft DirectX 8.0

COM ヘルパー関数

宣言 : Combase.h

DECLARE_IUNKNOWN新しいインターフェイスの基本インターフェイスの 3 つのメソッドを宣言する。
GetInterface要求されたクライアントへのインターフェイス ポインタを取得する。
INonDelegatingUnknownIUnknown インターフェイスの非委任版。
LoadOLEAut32Automation DLL (OleAut32.dll) を読み込む。

DECLARE_IUNKNOWN

COM ヘルパー関数

新しいインターフェイスの基本インターフェイスの 3 つのメソッドを宣言する。

構文

#define DECLARE_IUNKNOWN                                        \
    STDMETHODIMP QueryInterface(REFIID riid, void **ppv) {      \
        return GetOwner()->QueryInterface(riid,ppv);            \
    };                                                          \
    STDMETHODIMP_(ULONG) AddRef() {                             \
        return GetOwner()->AddRef();                            \
    };                                                          \
    STDMETHODIMP_(ULONG) Release() {                            \
        return GetOwner()->Release();                           \
    };

注意

新しいインターフェイスを作成する際は、IUnknown から派生しなければならない。これには、QueryInterfaceAddRef、および Release の 3 つのメソッドがある。このマクロは、新しいインターフェイス用にこれらの各メソッドを宣言し、宣言プロセスを簡略化する。

GetInterface

COM ヘルパー関数

インターフェイス ポインタを取得する。

構文

HRESULT GetInterface(
    LPUNKNOWN pUnk,
    void **ppv
);

パラメータ

pUnk
IUnknown インターフェイスへのポインタ。
ppv
取得されたインターフェイスへのポインタのアドレス。

戻り値

HRESULT 値を返す。

注意

このメンバ関数は、参照カウントのスレッドセーフ インクリメントを実行する。インターフェイスを取得し、参照を追加するには、INonDelegatingUnknown::NonDelegatingQueryInterface メソッドにオーバーライドする実装から、この関数を呼び出すこと。

INonDelegatingUnknown

COM ヘルパー関数

同じ COM オブジェクトの非委任および委任 IUnknown インターフェイスの両方をサポートするクラスを有効にするために、名前を変更した IUnknown の版。このインターフェイスは、vtable 順に次の 3 つのメソッドをサポートしている。

構文

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 をインクルードし、外部 unknown を呼び出す QueryInterfaceAddRef、および Release の実装を宣言する。
  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 コンストラクタに渡さなければならないので、デフォルトのコンストラクタは使用できない。メンバ変数をクラスへのポインタとし、コンストラクタで新しい呼び出しを行って、実際に作成する必要がある。

  6. 次のようなコードを使って、NonDelegatingQueryInterface をオーバーライドする。
    
         if (riid == IID_IMyInterface) {
             return m_pImplFilter->
                NonDelegatingQueryInterface(IID_IMyInterface, ppv);
         } else {
             return CUnknown::NonDelegatingQueryInterface(riid, ppv);
         }
    

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

LoadOLEAut32

COM ヘルパー関数

Automation ダイナミック リンク ライブラリ (OleAut32.dll) を読み込む。

構文

HINSTANCE LoadOLEAut32( );

戻り値

Automation DLL インスタンスへのハンドルを返す。

注意

CBaseObject デストラクタが OleAut32.dll を読み込んだオブジェクトを破壊する際に、ライブラリが読み込まれていると、そのライブラリはアンロードされる。