插件分发服务器
[与此页面关联的功能(DirectShow)是一项旧功能。 它已被 MediaPlayer、IMFMediaEngine取代,并在媒体基金会 音频/视频捕获。 这些功能已针对 Windows 10 和 Windows 11 进行了优化。 Microsoft强烈建议新代码尽可能使用 MediaPlayer、IMFMediaEngine 和 Media 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 图形中的更改:
- 当筛选器图在运行、暂停和停止状态之间切换时,它将调用 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,则返回错误代码。