Microsoft DirectX 8.0 |
宣言 : Combase.h
DECLARE_IUNKNOWN 新しいインターフェイスの基本インターフェイスの 3 つのメソッドを宣言する。 GetInterface 要求されたクライアントへのインターフェイス ポインタを取得する。 INonDelegatingUnknown IUnknown インターフェイスの非委任版。 LoadOLEAut32 Automation DLL (OleAut32.dll) を読み込む。
新しいインターフェイスの基本インターフェイスの 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 から派生しなければならない。これには、QueryInterface、AddRef、および Release の 3 つのメソッドがある。このマクロは、新しいインターフェイス用にこれらの各メソッドを宣言し、宣言プロセスを簡略化する。
インターフェイス ポインタを取得する。
構文
HRESULT GetInterface( LPUNKNOWN pUnk, void **ppv );
パラメータ
- pUnk
- IUnknown インターフェイスへのポインタ。
- ppv
- 取得されたインターフェイスへのポインタのアドレス。
戻り値
HRESULT 値を返す。
注意
このメンバ関数は、参照カウントのスレッドセーフ インクリメントを実行する。インターフェイスを取得し、参照を追加するには、INonDelegatingUnknown::NonDelegatingQueryInterface メソッドにオーバーライドする実装から、この関数を呼び出すこと。
同じ 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 を使うには、次のステップを実行する。
- インターフェイス (IMyInterface など) からクラスを派生する。
- クラス定義に DECLARE_IUNKNOWN をインクルードし、外部 unknown を呼び出す QueryInterface、AddRef、および Release の実装を宣言する。
- NonDelegatingQueryInterface にオーバーライドし、次のようなコードを使って IMyInterface を公開する。
if (riid == IID_IMyInterface) { return GetInterface((IMyInterface *) this, ppv); } else { return CUnknown::NonDelegatingQueryInterface(riid, ppv); }- MyInterface のメンバ関数を宣言し、実装する。
ネストしたインターフェイスで INonDelegatingUnknown を使うには、次のステップを実行する。
- CUnknown から派生したクラスを宣言する。
- クラス定義に DECLARE_IUNKNOWN をインクルードする。
- NonDelegatingQueryInterface をオーバーライドし、次のようなコードを使って IMyInterface を公開する。
if (riid == IID_IMyInterface) { return GetInterface((IMyInterface *) this, ppv); } else { return CUnknown::NonDelegatingQueryInterface(riid, ppv); }- IMyInterface のメンバ関数を実装する。CUnknown::GetOwner を使って、COM オブジェクト クラスにアクセスする。
- COM オブジェクト クラスで、ネストしたクラスを COM オブジェクト クラスのフレンドとし、ネストしたクラスのインスタンスを COM オブジェクト クラスのメンバとして宣言する。
外部 unknown と HRESULT は必ず CUnknown コンストラクタに渡さなければならないので、デフォルトのコンストラクタは使用できない。メンバ変数をクラスへのポインタとし、コンストラクタで新しい呼び出しを行って、実際に作成する必要がある。
- 次のようなコードを使って、NonDelegatingQueryInterface をオーバーライドする。
if (riid == IID_IMyInterface) { return m_pImplFilter-> NonDelegatingQueryInterface(IID_IMyInterface, ppv); } else { return CUnknown::NonDelegatingQueryInterface(riid, ppv); }複数の継承およびネストしたクラスによって、一部のインターフェイスをサポートする混合クラスを持つことができる。
Automation ダイナミック リンク ライブラリ (OleAut32.dll) を読み込む。
構文
HINSTANCE LoadOLEAut32( );
戻り値
Automation DLL インスタンスへのハンドルを返す。
注意
CBaseObject デストラクタが OleAut32.dll を読み込んだオブジェクトを破壊する際に、ライブラリが読み込まれていると、そのライブラリはアンロードされる。