[与此页面关联的功能(DirectShow)是一项旧功能。 它已被 MediaPlayer、IMFMediaEngine取代,并在媒体基金会 音频/视频捕获。 这些功能已针对 Windows 10 和 Windows 11 进行了优化。 Microsoft强烈建议新代码尽可能使用 MediaPlayer、IMFMediaEngine 和 Media Foundation 中的音频/视频捕获,而不是 DirectShow。 Microsoft建议重写使用旧 API 的现有代码,以尽可能使用新 API。]
本主题介绍如何在 Microsoft DirectShow 中将组件实现为动态链接库(DLL)。
DLL 必须实现以下函数,以便可以注册、注销并加载到内存中。
- DllMain:DLL 入口点。 dllMain 的名称 是库定义的函数名称的占位符。 DirectShow 实现使用名称 DllEntryPoint。 有关详细信息,请参阅平台 SDK。
- DllGetClassObject:创建类工厂实例。 前面各节中所述。
- DllCanUnloadNow:查询是否可以安全地卸载 DLL。
- DllRegisterServer:为 DLL 创建注册表项。
- DllUnregisterServer:删除 DLL 的注册表项。
其中,前三项由 DirectShow 实现。 如果工厂模板在 m_lpfnInit 成员变量中提供初始化函数,则从 DLL 入口点函数内部调用该函数。 有关系统何时调用 DLL 入口点函数的详细信息,请参阅 DllMain。
必须实现 DllRegisterServer 和 DllUnregisterServer,但 DirectShow 提供了一 个名为 AMovieDllRegisterServer2 的函数, 执行必要的工作。 组件只需包装此函数,如以下示例所示:
STDAPI DllRegisterServer()
{
return AMovieDllRegisterServer2( TRUE );
}
STDAPI DllUnregisterServer()
{
return AMovieDllRegisterServer2( FALSE );
}
但是,在 DllRegisterServer 和 DllUnregisterServer 可以根据需要自定义注册过程。 如果 DLL 包含筛选器,可能需要执行一些额外的工作。 有关详细信息,请参阅 如何注册 DirectShow 筛选器。
在模块定义 (.def) 文件中,导出除入口点函数之外的所有 DLL 函数。 下面是一个示例 .def 文件:
EXPORTS
DllGetClassObject PRIVATE
DllCanUnloadNow PRIVATE
DllRegisterServer PRIVATE
DllUnregisterServer PRIVATE
可以使用 Regsvr32.exe 实用工具注册 DLL。
相关主题