最終更新:2010-08-12 (木) 06:47:33 (3690d)  

COMオブジェクト
Top / COMオブジェクト

COM オブジェクトの概要

  • COM オブジェクトは、基本的に、1 つ以上のタスクを実行するためにアプリケーションで使用されるブラック ボックスです。それらは一般的に、DLL として実装されます。従来の DLL のように、COM オブジェクトは、任意のサポートされているタスクを実行するためにアプリケーションで呼び出すことができるメソッドを公開します。アプリケーションは、C++オブジェクト?とやり取りする場合と同じ方法で、COM オブジェクトとやり取りします。しかし、両者にはいくつか異なる点が存在します。
  • COM オブジェクトでは、C++ オブジェクトよりも厳密なカプセル化?が強制されます。単純にオブジェクトを作成してパブリック メソッドを呼び出すことはできません。COM オブジェクトのパブリック メソッドは、1 つ以上のインターフェイスにグループ化されます。メソッドを使用するには、オブジェクトを作成して、そのオブジェクトから適切なインターフェイスを取得する必要があります。通常、インターフェイスには、オブジェクトの特定の機能へのアクセスを提供する、関連のあるメソッド一式が含まれています。たとえば、IDirect3DCubeTexture? インターフェイスには、キューブ テクスチャー リソースを操作できるようにするメソッドが含まれています。インターフェイスに含まれていないメソッドにはアクセスできません。
  • COM オブジェクトは、C++ オブジェクトと同じ方法では作成できません。COM オブジェクトの作成方法はいくつかありますが、すべて、COM 固有のテクニックを伴います。DirectX API には、ほとんどの DirectX オブジェクトの作成を簡略化するさまざまなヘルパー関数とメソッドが含まれています。
  • オブジェクトの有効期間を制御するには、COM 固有のテクニックを使用する必要があります。
  • COM オブジェクトを明示的に読み込む必要はありません。COM オブジェクトは、通常は DLL 内に含まれています。しかし、COM オブジェクトを使用するために、DLL を明示的に読み込むことや、スタティック ライブラリへリンクする必要はありません。各 COM オブジェクトには、オブジェクトの作成に使用される一意な登録済み識別子があります。COM によって正しい DLL が自動的に読み込まれます。
  • COM はバイナリ仕様です。COM オブジェクトは、さまざまな言語で記述およびアクセスできます。オブジェクトのソース コードについて知る必要は何もありません。たとえば、Visual Basic アプリケーションでは、C++ で記述された COM オブジェクトを当たり前のように使用します。

オブジェクトとインターフェイス

  • オブジェクトとインターフェイスの違いを理解することは重要です。簡単な使用方法では、オブジェクトは、その主要なインターフェイスの名前によって参照されることがあります。ただし、厳密に言うと、この 2 つの用語は相互に置き換え可能ではありません。オブジェクトは、任意の数のインターフェイスを公開できます。たとえば、全てのオブジェクトが IUnknown インターフェイスを公開する必要があると同時に、それらは通常 1 つ以上のインターフェイスをさらに公開します。そして、多数のインターフェイスを公開する可能性があります。特定のメソッドを使用するには、オブジェクトを作成するだけでなく、適切なインターフェイスを取得する必要もあります。
  • また、複数のオブジェクトで、同じインターフェイスを公開する可能性があります。インターフェイスは、指定された一連の操作を実行するメソッドのグループです。インターフェイス定義では、メソッドの構文とそれらの一般的な機能が指定されます。特定の一連の処理をサポートする必要がある COM オブジェクトでは、適切なインターフェイスを公開することによってそれを実現できます。一部のインターフェイスは、非常に特化されており、単一のオブジェクトでしか公開されません。それ以外のインターフェイスは、さまざまな状況で役に立ち、多くのオブジェクトで公開されます。極端な例は IUnknown インターフェイスで、これは、すべての COM オブジェクトで公開される必要があります。
注  
オブジェクトでインターフェイスを公開する場合は、そのオブジェクトで、インターフェイス定義内のすべてのメソッドがサポートされている必要があります。つまり、すべてのメソッドを呼び出すことができ、それらの存在を確信できなければなりません。ただし、特定のメソッドの実装方法の詳細は、オブジェクトによって異なる可能性があります。たとえば、異なるオブジェクトでは、異なるアルゴリズムを使用して、最終的な結果に到達する可能性があります。また、メソッドが、単純でない方法でサポートされるという保証はありません。オブジェクトにおいて、一般的に使用されるインターフェイスを公開していても、メソッドのサブセットしかサポートする必要がない場合があります。まだ残りのメソッドを呼び出すことはできますが、E_NOTIMPL が返されます。特定のオブジェクトによるインターフェイスの実装方法を確認するには、そのドキュメントを参照してください。 
  • COM 規格では、インターフェイス定義は、一旦公開したら変更してはいけません。たとえば、既存のインターフェイスに新しいメソッドを追加することはできません。代わりに、新しいインターフェイスを作成する必要があります。インターフェイス内に存在しなければならないメソッドに関して制限はありませんが、一般的な方法では、次世代のインターフェイスに、古いインターフェイスのすべてのメソッドと、任意の新しいメソッドを含めます。
  • 1 つのインターフェイスに複数の世代があることは珍しくありません。通常は、全世代で、基本的にすべて同じタスクが実行されますが、それらの詳細は異なります。多くの場合、オブジェクトでインターフェイスのすべての世代が公開されます。それにより、新しいアプリケーションで新しいインターフェイスの機能を利用しながら、古いアプリケーションでオブジェクトの古いインターフェイスを使い続けることができます。一般的に、インターフェイスのすべてのファミリは、世代を示す整数が付いた同じ名前を持ちます。たとえば、元のインターフェイスが IMyInterface? という名前だった場合は、次の 2 世代には IMyInterface2 と IMyInterface3 という名前が付けられます。DirectX インターフェイスの場合は、後続の世代には、通常は DirectX のバージョン番号に由来する名前が付けられます。