クラス ファクトリとファクトリ テンプレート
[このページに関連付けられている機能 DirectShow は、従来の機能です。 MediaPlayer、IMFMediaEngine、Media Foundation のオーディオ/ビデオ キャプチャに置き換わりました。 これらの機能は、Windows 10とWindows 11用に最適化されています。 新しいコードでは、可能であれば、DirectShow ではなく Media Foundation で MediaPlayer、IMFMediaEngine、Audio/Video Capture を使用することを強くお勧めします。 Microsoft は、レガシ API を使用する既存のコードを、可能であれば新しい API を使用するように書き換えるよう提案しています。]
このトピックでは、 DirectShow 基本クラスを使用して DirectShow フィルターの DLL を実装する方法について説明します。
クライアントは、COM オブジェクトのインスタンスを作成する前に、 CoGetClassObject 関数の呼び出しを使用して、オブジェクトのクラス ファクトリのインスタンスを作成します。 次に、クライアントはクラス ファクトリの IClassFactory::CreateInstance メソッドを 呼び出します。 これは、コンポーネントを実際に作成し、要求されたインターフェイスへのポインターを返すクラス ファクトリです。 ( CoCreateInstance 関数は、関数呼び出し内でこれらの手順を組み合わせます)。
次の図は、メソッド呼び出しのシーケンスを示しています。
CoGetClassObject は 、 DLL で定義されている DllGetClassObject 関数を呼び出します。 この関数は、クラス ファクトリを作成し、クラス ファクトリ上のインターフェイスへのポインターを返します。 DirectShow は DllGetClassObject を実装しますが、関数は特定の方法でコードに依存します。 そのしくみを理解するには、DirectShow がクラス ファクトリを実装する方法を理解する必要があります。
クラス ファクトリは、別の COM オブジェクトの作成専用の COM オブジェクトです。 各クラス ファクトリには、作成する 1 種類のオブジェクトがあります。 DirectShow では、すべてのクラス ファクトリは同じ C++ クラス CClassFactory のインスタンスです。 クラス ファクトリは、ファクトリ テンプレートとも呼ばれる別のクラス CFactoryTemplate によって特殊化されています。 各クラス ファクトリには、ファクトリ テンプレートへのポインターが保持されます。 ファクトリ テンプレートには、コンポーネントのクラス識別子 (CLSID) や、コンポーネントを作成する関数へのポインターなど、特定のコンポーネントに関する情報が含まれています。
DLL は、DLL 内のコンポーネントごとに 1 つずつ、ファクトリ テンプレートのグローバル配列を宣言します。 DllGetClassObject は、新しいクラス ファクトリを作成するときに、一致する CLSID を持つテンプレートの配列を検索します。 見つかると、一致するテンプレートへのポインターを保持するクラス ファクトリが作成されます。 クライアントが IClassFactory::CreateInstance を呼び出すと、クラス ファクトリはテンプレートで定義されているインスタンス化関数を呼び出します。
次の図は、メソッド呼び出しのシーケンスを示しています。
このアーキテクチャの利点は、クラス ファクトリ全体を実装せずに、インスタンス化関数など、コンポーネントに固有のものをいくつか定義できることです。
関連トピック