实现 DllRegisterServer
[与此页面关联的功能 DirectShow 是旧版功能。 它已被 MediaPlayer、 IMFMediaEngine 和 Media Foundation 中的音频/视频捕获所取代。 这些功能已针对Windows 10和Windows 11进行了优化。 Microsoft 强烈建议新代码尽可能在 Media Foundation 中使用 MediaPlayer、 IMFMediaEngine 和 音频/视频捕获 ,而不是 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;
}