DLL 函数

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