DllRegisterServer の実装
[このページに関連付けられている機能 DirectShow は、従来の機能です。 MediaPlayer、IMFMediaEngine、Media Foundation のオーディオ/ビデオ キャプチャに置き換わりました。 これらの機能は、Windows 10とWindows 11用に最適化されています。 新しいコードでは、可能であれば、DirectShow ではなく Media Foundation で MediaPlayer、IMFMediaEngine、Audio/Video Capture を使用することを強くお勧めします。 Microsoft は、レガシ API を使用する既存のコードを、可能であれば新しい API を使用するように書き換えるよう提案しています。]
最後の手順では、 DllRegisterServer 関数を実装します。 コンポーネントを含む DLL は、この関数をエクスポートする必要があります。 関数は、セットアップ アプリケーションによって呼び出されるか、ユーザーがRegsvr32.exe ツールを実行するときに呼び出されます。
次の例は、 DlLRegisterServer の最小限の実装を示しています。
STDAPI DllRegisterServer(void)
{
return AMovieDllRegisterServer2(TRUE);
}
AMovieDllRegisterServer2 関数は、 内のすべてのコンポーネントのレジストリ エントリを作成します。
g_Templates
配列。 ただし、この関数にはいくつかの制限があります。 最初に、すべてのフィルターを "DirectShow フィルター" カテゴリ (CLSID_LegacyAmFilterCategory) に割り当てますが、すべてのフィルターがこのカテゴリに属しているわけではありません。 たとえば、キャプチャ フィルターと圧縮フィルターには独自のカテゴリがあります。 2 つ目は、フィルターがハードウェア デバイスをサポートしている場合、 AMovieDLLRegisterServer2 が処理しない 2 つの追加情報 ( medium と pin カテゴリ) を登録する必要がある場合があります。 メディアは、バスなどのハードウェア デバイス内の通信方法を定義します。 ピン カテゴリは、ピンの機能を定義します。 メディアの詳細については、Microsoft Windows ドライバー開発キット (DDK) の「KSPIN_MEDIUM」を参照してください。 ピン カテゴリの一覧については、「 Pin プロパティ セット」を参照してください。
フィルター カテゴリ、メディア、またはピン カテゴリを指定する場合は、DllRegisterServer 内から IFilterMapper2::RegisterFilter メソッドを呼び出します。 このメソッドは、フィルターに関する情報を指定する REGFILTER2 構造体へのポインターを受け取ります。
問題を複雑にするために、 REGFILTER2 構造体では、ピンを登録するための 2 つの異なる形式がサポートされています。 dwVersion メンバーは、次の形式を指定します。
- dwVersion が 1 の場合、ピン形式はAMOVIESETUP_PINされます (前述)。
- dwVersion が 2 の場合、ピン形式は REGFILTERPINS2 です。
REGFILTERPINS2 構造体には、ピン メディアとピン カテゴリのエントリが含まれています。 また、ブール値として宣言 AMOVIESETUP_PIN 一部の項目に対してビット フラグを使用します。
次の例は、DllRegisterServer 内から IFilterMapper2::RegisterFilter を呼び出す方法を示しています。
REGFILTER2 rf2FilterReg = {
1, // Version 1 (no pin mediums or pin category).
MERIT_NORMAL, // Merit.
1, // Number of pins.
&sudPins // Pointer to pin information.
};
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, // Filter CLSID.
g_wszName, // Filter name.
NULL, // Device moniker.
&CLSID_VideoCompressorCategory, // Video compressor category.
g_wszName, // Instance data.
&rf2FilterReg // Pointer to filter information.
);
pFM2->Release();
return hr;
}