DirectX 9.0 COM インターフェイスでの ATL の使用
DirectX 9.0 COM インターフェイスでの ATL の使用
Microsoft® DirectX® 9.0 で Active Template Library (ATL) を使うためには、ATL との互換性のためにインターフェイスを再定義する必要がある。これにより、CComQIPtr クラスを正しく使って、インターフェイスへのポインタを取得できる。
ATL に合わせてインターフェイスを再定義しないと、次のエラー メッセージが表示される。
C:\Program Files\Microsoft Visual Studio\VC98\ATL\INCLUDE\atlbase.h(566) :
error C2787: 'IDirectXFileData' : no GUID has been associated with this object
次のサンプル コードは、IDirectXFileData インターフェイスを定義する方法を示している。
// Explicit declaration
struct __declspec(uuid("{3D82AB44-62DA-11CF-AB39-0020AF71E433}")) IDirectXFileData;
// Macro method
#define RT_IID(iid_, name_) struct __declspec(uuid(iid_)) name_
RT_IID("{1DD9E8DA-1C77-4D40-B0CF-98FEFDFF9512}", IDirectXFileData);
インターフェイスを再定義した後は、Attach メソッドを使って、::Direct3DCreate9 が返すインターフェイス ポインタにインターフェイスをアタッチする必要がある。こうしないと、IDirect3D9 インターフェイスはスマート ポインタ クラスによって正しく解放されない。
オブジェクトが作成されたときと、CComPtr クラスにインターフェイスが割り当てられたときに、CComPtr クラスはインターフェイス ポインタで内部的に IUnknown::AddRef を呼び出す。インターフェイス ポインタのリークを防ぐため、::Direct3DCreate9 が返すインターフェイスで IUnknown::AddRef を呼び出してはならない。
次のコードは、IUnknown::AddRef を呼び出さずにインターフェイスを正しく解放する。
CComPtr<IDirect3D9> d3d;
d3d.Attach(::Direct3DCreate9(D3D_SDK_VERSION));
上のコードを使う。次のコードは使ってはならない。このコードでは、IUnknown::AddRef に続いて IUnknown::Release を呼び出していて、::Direct3DCreate9 によって追加された参照を解放しない。
CComPtr<IDirect3D9> d3d = ::Direct3DCreate9(D3D_SDK_VERSION);
これは、Microsoft Direct3D® において、このような方法で Attach メソッドを使う必要がある唯一の場所である。
CComPTR クラスおよび CComQIPtr クラスの詳細については、Atlbase.h ヘッダー ファイルの定義を参照すること。