Microsoft DirectX 8.0 (C++)

COM オブジェクトの作成

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;