DLL 函数

[与此页面关联的功能(DirectShow)是一项旧功能。 它已被 MediaPlayerIMFMediaEngine取代,并在媒体基金会 音频/视频捕获。 这些功能已针对 Windows 10 和 Windows 11 进行了优化。 Microsoft强烈建议新代码尽可能使用 MediaPlayerIMFMediaEngineMedia 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

必须实现 DllRegisterServerDllUnregisterServer,但 DirectShow 提供了一 个名为 AMovieDllRegisterServer2 的函数, 执行必要的工作。 组件只需包装此函数,如以下示例所示:

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

STDAPI DllUnregisterServer()
{
    return AMovieDllRegisterServer2( FALSE );
}

但是,在 DllRegisterServerDllUnregisterServer 可以根据需要自定义注册过程。 如果 DLL 包含筛选器,可能需要执行一些额外的工作。 有关详细信息,请参阅 如何注册 DirectShow 筛选器

在模块定义 (.def) 文件中,导出除入口点函数之外的所有 DLL 函数。 下面是一个示例 .def 文件:

EXPORTS
    DllGetClassObject PRIVATE
    DllCanUnloadNow PRIVATE
    DllRegisterServer PRIVATE
    DllUnregisterServer PRIVATE

可以使用 Regsvr32.exe 实用工具注册 DLL。

如何创建 DirectShow 筛选器 DLL