次の方法で共有


DllRegisterServer の実装

[このページに関連付けられている機能 DirectShow は、従来の機能です。 MediaPlayer、IMFMediaEngine、Media Foundation のオーディオ/ビデオ キャプチャに置き換わりました。 これらの機能は、Windows 10とWindows 11用に最適化されています。 新しいコードでは、可能であれば、DirectShow ではなく Media Foundation で MediaPlayerIMFMediaEngineAudio/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 つの追加情報 ( mediumpin カテゴリ) を登録する必要がある場合があります。 メディアは、バスなどのハードウェア デバイス内の通信方法を定義します。 ピン カテゴリは、ピンの機能を定義します。 メディアの詳細については、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;
}