ファクトリ テンプレート配列
[このページに関連付けられている機能 DirectShow は、従来の機能です。 MediaPlayer、IMFMediaEngine、および Media Foundation のオーディオ/ビデオ キャプチャに置き換わりました。 これらの機能は、Windows 10とWindows 11用に最適化されています。 新しいコードでは、可能であれば、DirectShow ではなく Media Foundation で MediaPlayer、IMFMediaEngine、Audio/Video Capture を使用することを強くお勧めします。 Microsoft は、従来の API を使用する既存のコードを、可能であれば新しい API を使用するように書き直すよう提案しています。]
ファクトリ テンプレートには、次のパブリック メンバー変数が含まれています。
const WCHAR * m_Name; // Name
const CLSID * m_ClsID; // CLSID
LPFNNewCOMObject m_lpfnNew; // Function to create an instance
// of the component
LPFNInitRoutine m_lpfnInit; // Initialization function (optional)
const AMOVIESETUP_FILTER * m_pAMovieSetup_Filter; // Set-up information (for filters)
m_lpfnNewとm_lpfnInitの 2 つの関数ポインターでは、次の型定義を使用します。
typedef CUnknown *(CALLBACK *LPFNNewCOMObject)(LPUNKNOWN pUnkOuter, HRESULT *phr);
typedef void (CALLBACK *LPFNInitRoutine)(BOOL bLoading, const CLSID *rclsid);
1 つ目は、コンポーネントのインスタンス化関数です。 2 つ目は、省略可能な初期化関数です。 初期化関数を指定すると、DLL エントリ ポイント関数内から呼び出されます。 (DLL エントリ ポイント関数については、この記事の後半で説明します)。
CUnknown から継承する CMyComponent という名前のコンポーネントを含む DLL を作成しているとします。 DLL には、次の項目を指定する必要があります。
- 初期化関数。CMyComponent の新しいインスタンスを返すパブリック メソッドです。
- g_Templatesという名前のファクトリ テンプレートのグローバル配列 。 この配列には、CMyComponent のファクトリ テンプレートが含まれています。
- 配列のサイズ を指定する g_cTemplates という名前のグローバル変数。
次の例は、これらの項目を宣言する方法を示しています。
// Public method that returns a new instance.
CUnknown * WINAPI CMyComponent::CreateInstance(LPUNKNOWN pUnk, HRESULT *pHr)
{
CMyComponent *pNewObject = new CMyComponent(NAME("My Component"), pUnk, pHr );
if (pNewObject == NULL) {
*pHr = E_OUTOFMEMORY;
}
return pNewObject;
}
CFactoryTemplate g_Templates[1] =
{
{
L"My Component", // Name
&CLSID_MyComponent, // CLSID
CMyComponent::CreateInstance, // Method to create an instance of MyComponent
NULL, // Initialization function
NULL // Set-up information (for filters)
}
};
int g_cTemplates = sizeof(g_Templates) / sizeof(g_Templates[0]);
メソッドは CreateInstance
クラス コンストラクターを呼び出し、新しいクラス インスタンスへのポインターを返します。 パラメーター pUnk は、集計 IUnknown へのポインターです。 このパラメーターをクラス コンストラクターに渡すことができます。 パラメーター pHr は、HRESULT 値へのポインターです。 クラス コンストラクターはこれを適切な値に設定しますが、コンストラクターが失敗した場合は、値を E_OUTOFMEMORY に設定します。
NAME マクロはデバッグ ビルドで文字列を生成しますが、製品版ビルドでは NULL に解決されます。 この例では、デバッグ ログに表示されますが、最終バージョンではメモリを占有しない名前をコンポーネントに付けるために使用します。
クラス ファクトリは CreateInstance
ファクトリ テンプレート内の関数ポインターを参照するため、メソッドには任意の名前を付けることができます。 ただし、 g_Templates と g_cTemplates は、クラス ファクトリが見つけることを期待するグローバル変数であるため、これらの名前を正確に持っている必要があります。
関連トピック