次の方法で共有


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 ヘッダー ファイルの定義を参照すること。