次の方法で共有


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

[このページに関連付けられている機能 DirectShow は、従来の機能です。 MediaPlayer、IMFMediaEngine、Media Foundation のオーディオ/ビデオ キャプチャに置き換わりました。 これらの機能は、Windows 10とWindows 11用に最適化されています。 新しいコードでは、可能であれば、DirectShow ではなく Media Foundation で MediaPlayerIMFMediaEngineAudio/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 を呼び出すと、クラス ファクトリはテンプレートで定義されているインスタンス化関数を呼び出します。

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

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

このアーキテクチャの利点は、クラス ファクトリ全体を実装せずに、インスタンス化関数など、コンポーネントに固有のものをいくつか定義できることです。

DirectShow フィルター DLL を作成する方法