Platform SDK: DirectX

C++ と COM インターフェイス

[Visual Basic]

ここでは、C++ でのアプリケーション開発について説明する。Visual Basic については、「Visual Basic プログラミングについて」を参照すること。

[C++]

COM インターフェイスは、C++ でいうところの抽象基本クラスのようなものである。つまり、一連の特徴や意味は定義するものの、具体的な実装は定義せず、状態データも一切関連付けられていない。C++ の抽象基本クラスでは、すべでのメソッドが純粋仮想関数として定義され、コードは一切割り当てられない。

C++ の純粋仮想関数と COM インターフェイスは、どちらも vtable と呼ばれる機構を使用する。vtable には、インターフェイスを実装するために必要なすべての関数のアドレスが格納される。アプリケーションまたはオブジェクト内でこれらの関数を使用したい場合は、QueryInterface メソッドを呼び出して、目的のオブジェクトにそのインターフェイスがあるかどうかを調べ、そのインターフェイスへのポインタを取得すればよい。QueryInterface を呼び出した後、このオブジェクトはアプリケーションやオブジェクトに vtable へのポインタを送る。このメソッドがオブジェクトによって実装される各種インターフェイス メソッドを呼び出せるのも、vtable へのポインタを使っているためである。このメカニズムにより、オブジェクトが使用するプライベート データと呼び出し側のクライアントの処理は完全に切り離される。

COM オブジェクトと C++ のオブジェクトのもう 1 つの類似点は、メソッドの最初の引数がインターフェイス (C++ の場合はクラス) の名前であることだ。これは、C++ では this 引数と呼ばれる。COM オブジェクトと C++ のオブジェクトはバイナリレベルで完全に互換性があるため、コンパイラは、COM インターフェイスを C++ の抽象クラスと同じように扱い、同じ構文を持つことを前提に処理する。このため、コードの複雑さは軽減される。たとえば、C++ での this 引数は、既に解釈されたパラメータとして扱われてコード化されず、vtable を使った間接的な呼び出しも C++ では暗黙的に処理される。