DllRegisterServer の実装
最後のステップは、DllRegisterServer 関数の実装である。コンポーネントが含まれた DLL は、この関数を公開しなければならない。この関数は、セットアップ プログラム、またはユーザーが Regsvr32.exe ツールを実行したときに呼び出される。
次の例に、DlLRegisterServer の最小限の実装を示す。
STDAPI DllRegisterServer(void)
{
return AMovieDllRegisterServer2(TRUE);
}
AMovieDllRegisterServer2 関数は、g_Templates 配列のすべてのコンポーネント用にレジストリのエントリを作成する。ただし、この関数には制限がいくつかある。まず、この関数はすべてのフィルタを "DirectShow Filters" カテゴリ (CLSID_LegacyAmFilterCategory) に割り当てるが、すべてのフィルタがこのカテゴリに属するわけではない。たとえば、キャプチャ フィルタや圧縮フィルタは、それぞれのカテゴリを持っている。次に、フィルタがハードウェア デバイスをサポートしている場合は、AMovieDLLRegisterServer2 が処理しない 2 つの追加情報、つまり "メディア" と "ピン カテゴリ" を登録する必要がある。メディアは、ハードウェア デバイスの通信方法 (バスなど) を定義し、ピン カテゴリは、ピンの機能を定義する。メディアの詳細については、Microsoft Windows Driver Development Kit (DDK) の「KSPIN_MEDIUM」を参照すること。ピン カテゴリの一覧については、「ピン プロパティ セット」を参照すること。
フィルタ カテゴリ、メディア、またはピン カテゴリを指定する場合は、DllRegisterServer 内から IFilterMapper2::RegisterFilter メソッドを呼び出す。このメソッドは、REGFILTER2 構造体へのポインタを受け取る。REGFILTER2 構造体は、フィルタに関する情報を指定する。
面倒なのは、REGFILTER2 構造体が、ピンを登録するためのフォーマットを 2 種類サポートしていることである。dwVersion メンバで、このフォーマットを指定する。
- dwVersion が 1 の場合、ピン フォーマットは AMOVIESETUP_PIN (前で説明) である。
- dwVersion が 2 の場合、ピン フォーマットは REGFILTERPINS2 である。
REGFILTERPINS2 構造体には、ピン メディアとピン カテゴリのエントリが含まれる。また、一部の項目については、AMOVIESETUP_PIN がブール値として宣言するビット フラグを使う。
次の例に、DllRegisterServer の中から IFilterMapper2::RegisterFilter を呼び出す方法を示す。
REGFILTER2 rf2FilterReg = {
1, // Version 1 (ピン メディアとピン カテゴリなし)。
MERIT_NORMAL, // メリット。
1, // ピンの数。
&sudPins // ピン情報へのポインタ。
};
STDAPI DllRegisterServer(void)
{
HRESULT hr;
IFilterMapper2 *pFM2 = NULL;
hr = AMovieDllRegisterServer2(TRUE);
if (FAILED(hr))
return hr;
hr = CoCreateInstance(CLSID_FilterMapper2, NULL, CLSCTX_INPROC_SERVER,
IID_IFilterMapper2, (void **)&pFM2);
if (FAILED(hr))
return hr;
hr = pFM2->RegisterFilter(
CLSID_SomeFilter, // フィルタ CLSID。
g_wszName, // フィルタ名。
NULL, // デバイス モニカ。
&CLSID_VideoCompressorCategory, // ビデオ コンプレッサ カテゴリ。
g_wszName, // インスタンス データ。
&rf2FilterReg // フィルタ情報へのポインタ。
);
pFM2->Release();
return hr;
}