Platform SDK: DirectX |
ここでは、C++ でのアプリケーション開発について説明する。Visual Basic については、「Visual Basic プログラミングについて」を参照すること。
COM では、オブジェクトの機能を更新する際には、既存インターフェイスのメソッドを変更するのではなく、新しい機能を実現するための新しいインターフェイスを追加するように定められている。COM 上に構築されたオブジェクトは、既存インターフェイスを変更せずに残しておくことで、古いアプリケーションとの互換性を失うことのないまま、サービス内容を自由に拡張できる。
DirectX のコンポーネントは、この試みに従って開発されている。たとえば、DirectDraw コンポーネントでは、IDirectDrawSurface、IDirectDrawSurface2、IDirectDrawSurface3、IDirectDrawSurface4、および IDirectDrawSurface7 の 5 つのインターフェイスのいずれを使っても、DirectDrawSurface オブジェクトにアクセスできるようになっている。これらの各インターフェイスは、それより以前のバージョンで提供されていたメソッドを無変更でサポートするが、新しい機能をサポートするために新しいメソッドを追加している。
アプリケーションで新しい機能が必要なければ、新しいインターフェイスを取得する必要はない。新しいインターフェイスが提供する機能を利用したい場合は、そのインターフェイスのグローバル ユニーク識別子 (GUID) を指定して、対象オブジェクトの IUnknown::QueryInterface メソッドを呼び出さなければならない。インターフェイスの GUID は、対応するヘッダー ファイル内で宣言されている。
次の例は、新しいインターフェイスがサポートされているかどうかを調べる方法を示している。
LPDIRECTDRAW lpDD1; LPDIRECTDRAW2 lpDD2; ddrval = DirectDrawCreate( NULL, &lpDD1, NULL ); if( FAILED(ddrval)) goto ERROROUT; // IDirectDraw2 インターフェイスがあるかどうかを問い合わせる。 ddrval = lpDD1->QueryInterface(IID_IDirectDraw2, (void **)&lpDD2); if( FAILED(ddrval)) goto ERROROUT; // IDirectDraw2 があることがわかったので、元のインターフェイスを解放する。 lpDD1->Release();
まれに、新しいインターフェイスが、旧バージョンのインターフェイスでサポートされていたメソッドの一部をサポートしない場合もある。その一例として、IDirect3DDevice2 インターフェイスが挙げられる。旧バージョンのインターフェイスで提供されていた機能を必要とするアプリケーションでは、前の例で示したのと同じ方法で、旧バージョンのインターフェイスの GUID を使って、古いインターフェイスを取得すればよい。