次の方法で共有


クラス ファクトリとファクトリ テンプレート

クライアントは COM オブジェクトのインスタンスを作成する前に、CoGetClassObject 関数呼び出しを使ってオブジェクトのクラス ファクトリのインスタンスを作成する。次にクライアントは、クラス ファクトリの IClassFactory::CreateInstance メソッドを呼び出す。実際にコンポーネントを作成したり、要求されたインターフェイスへのポインタを返すのはクラス ファクトリである。(CoCreateInstance 関数は、これらのステップを関数呼び出し内で組み合わせる。)

次の図に、メソッド呼び出しのシーケンスを示す。

クラス ファクトリを作成するために呼び出されたメソッド

CoGetClassObject は、DLL で定義された DllGetClassObject 関数を呼び出す。この関数はクラス ファクトリを作成し、クラス ファクトリ上のインターフェイスへのポインタを返す。DirectShow は DllGetClassObject を実装するが、この関数は特定の部分でコードに依存する。この動作を理解するためには、DirectShow がどのようにクラス ファクトリを実装するかを理解することが必要である。

クラス ファクトリは、別の COM オブジェクトの作成処理に特化した COM オブジェクトである。それぞれのクラス ファクトリでは、作成するオブジェクトの型が決まっている。DirectShow では、すべてのクラス ファクトリは同じ C++ クラス CClassFactory のインスタンスである。クラス ファクトリは、"ファクトリ テンプレート" と呼ばれる別のクラス CFactoryTemplate によって特化される。各クラス ファクトリは、ファクトリ テンプレートへのポインタを保持する。ファクトリ テンプレートには、特定のコンポーネントに関する情報 (コンポーネントのクラス識別子 (CLSID) など) と、そのコンポーネントを作成した関数へのポインタが格納される。

DLL は、ファクトリ テンプレートのグローバル配列を DLL 内の各コンポーネントに 1 つずつ宣言する。新しいクラス ファクトリを作成するとき、DllGetClassObject は同じ CLSID を持つテンプレートの配列を探す。該当するものが見つかると、DllGetClassObject は当該テンプレートへのポインタを保持するクラス ファクトリを作成する。クライアントが IClassFactory::CreateInstance を呼び出すと、そのクラス ファクトリはテンプレートに定義されているインスタンス化関数を呼び出す。

次の図に、メソッド呼び出しのシーケンスを示す。

DLL 内のクラス ファクトリ テンプレート

このアーキテクチャの利点は、クラス ファクトリ全体を実装することなく、インスタンス化関数などのコンポーネントに固有のいくつかの要素だけを定義すればよいということである。