實作 DllRegisterServer

[與此頁面相關的功能 DirectShow是舊版功能。 它已被 MediaPlayerIMFMediaEngineMedia Foundation 中的音訊/視訊擷取取代。 這些功能已針對Windows 10和Windows 11進行優化。 Microsoft 強烈建議新程式碼盡可能使用 MediaPlayerIMFMediaEngine音訊/視訊擷取 ,而不是 DirectShow。 Microsoft 建議使用舊版 API 的現有程式碼盡可能重寫為使用新的 API。

最後一個步驟是實作 DllRegisterServer 函式。 包含元件的 DLL 必須匯出此函式。 此函式將由設定應用程式呼叫,或在使用者執行Regsvr32.exe工具時呼叫。

下列範例示範 DlLRegisterServer的最小實作:

STDAPI DllRegisterServer(void)
{
    return AMovieDllRegisterServer2(TRUE);
}

AMovieDllRegisterServer2函式會為 中的每個元件建立登錄專案

g_Templates

陣列。 不過,此函式有一些限制。 首先,它會將每個篩選指派給 「DirectShow Filter」 類別 (CLSID_LegacyAmFilterCategory) ,但並非所有篩選都屬於此類別。 例如,擷取篩選和壓縮篩選準則有自己的類別。 其次,如果您的篩選支援硬體裝置,您可能需要註冊 AMovieDLLRegisterServer2 未處理的其他兩項資訊: 媒體針腳類別。 媒體會定義硬體裝置中的通訊方法,例如匯流排。 針腳類別會定義針腳的函式。 如需媒體的相關資訊,請參閱 Microsoft Windows 驅動程式開發工具組 (DDK) 中的「KSPIN_MEDIUM」。 如需釘選類別清單,請參閱 Pin 屬性集

如果您想要指定篩選類別、中型或釘選類別,請從DllRegisterServer內呼叫IFilterMapper2::RegisterFilter方法。 這個方法會採用 REGFILTER2 結構的指標,這個結構會指定篩選的相關資訊。

為了稍微複雜一點, REGFILTER2 結構支援兩種不同的格式來註冊針腳。 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;
}