插件分发服务器
[与此页面关联的功能 DirectShow 是旧版功能。 它已被 MediaPlayer、 IMFMediaEngine 和 Media Foundation 中的音频/视频捕获所取代。 这些功能已针对Windows 10和Windows 11进行了优化。 Microsoft 强烈建议新代码尽可能在 Media Foundation 中使用 MediaPlayer、 IMFMediaEngine 和 音频/视频捕获 ,而不是 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 有关图形中的更改:
- 当筛选器图在运行、暂停和停止状态之间切换时,它将调用 IDistributorNotify::Run、 IDistributorNotify::P ause 或 IDistributorNotify::Stop。
- 设置引用时钟时,筛选器图管理器将调用 IDistributorNotify::SetSyncSource。
- 添加或删除筛选器或更改固定连接时,筛选器图管理器将调用 IDistributorNotify::NotifyGraphChange。
若要实现自定义 PID,请创建支持聚合的 COM 对象。 它必须支持筛选器图管理器尚不支持的接口。 (可选)它可以支持 IDistributorNotify 接口。
如果 PID 从筛选器图管理器获取任何接口指针,则应立即释放它们。 否则,它可能会创建循环引用计数,从而防止销毁筛选图管理器。 在任何情况下,都不需要在筛选器图管理器上保留引用计数,因为筛选器图管理器控制 PID 的生存期。
由于 PID 专为筛选器图管理器的聚合而设计,因此可能需要在 PID 的构造函数方法中强制实施此目的。 检查外部 IUnknown 指针是否为 NULL,如果是,则返回错误代码VFW_E_NEED_OWNER。 (请参阅错误和成功代码。) 此外,若要防止其他对象聚合 PID,可以查询 IGraphBuilder 接口的外部 IUnknown 指针。 如果对象不公开 IGraphBuilder,则返回错误代码。