マクロによる DirectX COM メソッドの呼び出し

マクロによる DirectX COM メソッドの呼び出し

Microsoft® DirectX® コンポーネント オブジェクト モデル (COM) インターフェイスの多くには、アプリケーションでより簡単にメソッドを使えるように、各メソッド用に定義されたマクロが用意されている。これらのマクロは、インターフェイスの宣言と同じヘッダー ファイルで定義されている。マクロは、C と C++ の両方のアプリケーションで使えるように設計されている。C++ マクロを使うには、_cplusplus を定義する必要がある。これを定義しない場合は、C マクロが使われる。マクロの構文はどちらの言語でも同じであるが、ヘッダー ファイルに含まれる一連のマクロ定義は異なり、それぞれの適切な呼び出し表記に合わせて拡張されている。

たとえば、d3d.h ヘッダー ファイル内の次のコードでは、IDirect3D9::GetAdapterIdentifier メソッドに対する C と C++ 両方のマクロが定義されている。

...
#define IDirect3D9_GetAdapterIdentifier(p,a,b,c) (p)->lpVtbl->GetAdapterIdentifier(p,a,b,c)
...
#else
...
#define IDirect3D9_GetAdapterIdentifier(p,a,b,c) (p)->GetAdapterIdentifier(a,b,c)
...
#endif

これらのマクロのいずれかを使うには、まず、関連付けられているインターフェイスへのポインタを取得する必要がある。マクロの最初のパラメータに、このポインタを設定する。その他のパラメータは、メソッドのパラメータにマップされる。マクロの戻り値は、メソッドが返す HRESULT 値である。次のコードは、マクロを使って IDirect3D9::GetAdapterIdentifier メソッドを呼び出している。ここで、pD3D は、IDirect3D9 インターフェイスへのポインタを表す。

hr = IDirect3D9_GetAdapterIdentifier(pD3D,
                                     Adapter,
                                     dwFlags,
                                     pIdentifier);