实现 DllRegisterServer

[与此页面关联的功能 DirectShow 是旧版功能。 它已被 MediaPlayerIMFMediaEngineMedia Foundation 中的音频/视频捕获所取代。 这些功能已针对Windows 10和Windows 11进行了优化。 Microsoft 强烈建议新代码尽可能在 Media Foundation 中使用 MediaPlayerIMFMediaEngine音频/视频捕获 ,而不是 DirectShow。 如果可能,Microsoft 建议重写使用旧 API 的现有代码以使用新 API。]

最后一步是实现 DllRegisterServer 函数。 包含组件的 DLL 必须导出此函数。 该函数将由设置应用程序调用,或者在用户运行Regsvr32.exe工具时调用。

以下示例演示 DlLRegisterServer 的最小实现:

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

AMovieDllRegisterServer2 函数为 中的每个组件创建注册表项

g_Templates

数组。 但是,此函数有一些限制。 首先,它将每个筛选器分配给“DirectShow 筛选器”类别 (CLSID_LegacyAmFilterCategory) ,但并非每个筛选器都属于此类别。 例如,捕获筛选器和压缩筛选器具有各自的类别。 其次,如果筛选器支持硬件设备,则可能需要注册 AMovieDLLRegisterServer2 不处理的其他两条信息: 介质引脚类别。 媒体定义硬件设备(如总线)中的通信方法。 引脚类别定义引脚的功能。 有关媒体的信息,请参阅 Microsoft Windows 驱动程序开发工具包 (DDK) 中的“KSPIN_MEDIUM”。 有关固定类别的列表,请参阅 固定属性集

如果要指定筛选器类别、介质或固定类别,请从 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;
}