次の方法で共有


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;
}