插件分发服务器

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

插件分发程序(PID)是扩展筛选器图形管理器功能的一种方法。 插件分发服务器是筛选器图形管理器在运行时聚合的 COM 对象。 应用程序通过筛选器图形管理器获取对 PID 的访问权限。

如果查询筛选器图形管理器不支持的接口,则会在注册表中搜索具有以下格式的键:

HKEY_CLASSES_ROOT\Interface\IID\Distributor

IID 是包含接口标识符的字符串。 如果注册表项存在,则条目的值定义支持接口的 PID 的类标识符(CLSID)。 筛选器图形管理器聚合 PID 并返回接口指针,从而充当 PID 的外部 IUnknown。 当应用程序在接口上调用方法时,它实际上在 PID 上调用它们。 但是,PID 的存在对应用程序是透明的。

术语 分发服务器 源于 PID 可以查询其外部 IUnknown 指针以获取筛选器图形管理器上的接口的事实。 通过调用 IFilterGraph::EnumFilters 方法,PID 可以枚举图形中的筛选器,并将方法调用分发到这些筛选器。 这样,PID 就可以充当应用程序在筛选器上调用方法的单一控制点。

筛选器图形管理器聚合 PID 时,它会查询 IDistributorNotify 接口的 PID。 如果 PID 支持此接口,筛选器图形管理器会使用它来通知 PID 图形中的更改:

若要实现自定义 PID,请创建支持聚合的 COM 对象。 它必须支持筛选器图形管理器尚不支持的接口。 (可选)它可以支持 IDistributorNotify 接口。

如果 PID 从筛选器图形管理器获取任何接口指针,则应立即释放它们。 否则,它可能会创建循环引用计数,这可能会阻止筛选器图形管理器被销毁。 在任何情况下,都不需要对筛选器图形管理器保留引用计数,因为筛选器图形管理器控制 PID 的生存期。

由于 PID 专为筛选器图形管理器的聚合而设计,因此可能需要在 PID 的构造函数方法中强制实施此作。 检查外部 IUnknown 指针是否 NULL,如果是,则返回错误代码VFW_E_NEED_OWNER。 (请参阅 错误和成功代码。)此外,为了防止其他对象聚合 PID,可以查询 IGraphBuilder 接口的外部 IUnknown 指针。 如果对象未公开 IGraphBuilder,则返回错误代码。