C による COM オブジェクトへのアクセス
C による COM オブジェクトへのアクセス
コンポーネント オブジェクト モデル (COM) プログラミングで最も一般的に使われている言語は C++ であるが、C を使っても COM オブジェクトにアクセスできる。COM を使う方法は、操作は比較的わかりやすいが、複雑な構文が必要になる。
- すべてのメソッドで、パラメータ リストの最初にパラメータが 1 つ追加されている。このパラメータは、インターフェイス ポインタに設定する必要がある。
- オブジェクトの vtable を明示的に参照する必要がある。
すべての COM オブジェクトにはそれぞれ vtable があり、この中には、そのオブジェクトが公開するメソッドへのポインタのリストが含まれている。インターフェイス ポインタは vtable 内の場所を示している。そこには、呼び出されたメソッドへのポインタが格納されている。このドキュメントの他の場所では、vtable については説明されていない。これは、C++ では、vtable は基本的に不可視であるためである。ただし、C で COM メソッドを呼び出す場合は、間接呼び出しのレベルを 1 つ追加して、vtable を明示的に参照する必要がある。
次のコードは、C++ での呼び出し規則を使って IDirectPlay8Peer::Initialize メソッドを呼び出す方法を示している。
g_pDP->Initialize( NULL, DirectPlayMessageHandler, 0 );
C で同じメソッドを呼び出すには、次の構文を使用する。vtable ポインタの名前は lpVtbl と表記される。
g_pDP->lpVtbl->Initialize(g_pDP,NULL, DirectPlayMessageHandler, 0);
コンポーネントによっては、ヘッダー ファイルに、呼び出し用の正しい表記に変換するマクロが定義されている場合もある。詳細については、「マクロによる DirectX COM メソッドの呼び出し」を参照すること。