Microsoft DirectX 8.0 (C++) |
COM オブジェクトを作成する方法はいくつかある。Microsoft® DirectX® プログラミングでは、次の 2 つの方法が最も一般的に使用されている。
オブジェクトを作成する際は、CoInitialize 関数を呼び出してあらかじめ COM を初期化しておく必要がある。間接的にオブジェクトを作成する場合は、オブジェクト作成メソッドによってこの処理が行われる。CoCreateInstance を使ってオブジェクトを作成する必要がある場合は、明示的に CoInitialize を呼び出さなければならない。オブジェクトの作成を終了したら、CoUninitialize を呼び出して COM を未初期化する必要がある。CoInitialize を呼び出したら、必ず対応する CoUninitialize を呼び出さなければならない。COM を明示的に初期化する必要があるアプリケーションでは、スタートアップ ルーチンで COM を初期化し、クリーンアップ ルーチンで未初期化するのが一般的である。
CoCreateInstance で COM オブジェクトの新しいインスタンスを作成するには、オブジェクトの CLSID が必要である。公開されている CLSID は、リファレンス ドキュメントまたは該当するヘッダー ファイルに記述されている。CLSID が公開されていない場合は、そのオブジェクトを直接作成することはできない。
CoCreateInstance 関数には 5 つのパラメータがある。DirectX で使用する COM オブジェクトを作成する場合は、通常、次のパラメータを設定する。
たとえば、次のコードは、DirectPlay8 オブジェクトの新しいインスタンスを作成して、IDirectPlay8Peer インターフェイスへのポインタを変数 g_pDP に返している。エラーが発生すると、メッセージ ボックスが表示されて、アプリケーションが終了する。
IDirectPlay8Peer* g_pDP = NULL; ... CoInitialize( NULL ); ... hr = CoCreateInstance( CLSID_DirectPlay8, NULL, CLSCTX_INPROC_SERVER, IID_IDirectPlay8Peer, (LPVOID*) &g_pDP ); if( FAILED( hr ) ) { MessageBox( NULL, TEXT("Failed Creating IDirectPlay8Peer. "), TEXT("DirectPlay Sample"), MB_OK | MB_ICONERROR ); return FALSE; }
通常は、オブジェクトを間接的に作成する方が非常に簡単である。オブジェクト作成メソッドにインターフェイス ポインタのアドレスを渡すだけでよい。後は、メソッドによってオブジェクトが作成されて、インターフェイス ポインタが返される。通常、間接的な方法でオブジェクトを作成する場合は、メソッドによって返されるインターフェイスを選択できない。ただし、オブジェクトの作成方法について、さまざまな事項を指定できる。たとえば、次のコードは、前述の IDirect3D8::CreateDevice メソッドを呼び出して、ディスプレイ アダプタを表すデバイス オブジェクトを作成している。このメソッドは、オブジェクトの IDirect3DDevice8 インターフェイスへのポインタを返す。最初の 4 つのパラメータは、オブジェクトを作成するために必要な各種の情報を指定し、5 番目のパラメータはインターフェイス ポインタを受け取る。詳細については、リファレンス ドキュメントを参照すること。
IDirect3DDevice8 *g_pd3dDevice = NULL; ... if( FAILED( g_pD3D->CreateDevice(D3DADAPTER_DEFAULT, 3DDEVTYPE_HAL, hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &g_pd3dDevice ))) return E_FAIL;