IKsAggregateControl 接口 (ksproxy.h)

IKsAggregateControl 接口提供在支持接口的 KS 对象上添加和删除 COM 服务器作为聚合提供程序的方法。

此接口的接口标识符 (IID) IID_IKsAggregateControl。

继承

IKsAggregateControl 接口继承自 IUnknown 接口。

方法

IKsAggregateControl 接口具有这些方法。

 
IKsAggregateControl::KsAddAggregate

KsAddAggregate 方法将 COM 服务器作为聚合提供程序添加到公开 IKsAggregateControl 接口的 KS 对象的接口提供程序列表中。
IKsAggregateControl::KsRemoveAggregate

KsRemoveAggregate 方法从公开 IKsAggregateControl 接口的 KS 对象的接口提供程序列表中删除以前添加的 COM 服务器聚合提供程序。

注解

KS 筛选器或引脚支持的所有属性、方法和事件集都可以在筛选器或引脚对象的 DirectShow 代理表示形式上通过零个或多个聚合接口、对话等表示。 这些客户端聚合接口是集扩展,然后可用于与基础 KS 对象通信,以表示集的功能。 集扩展是已注册的 COM 服务器,在创建句柄时,KS 筛选器或引脚通过 CoCreateInstance 加载该服务器。

集扩展的主要用途是允许聚合接口,以便通过一个或多个 COM 接口支持某些集。 但是,实现还可能包括对对话的支持、线程中的异步处理等。 通过注册集处理程序,可以指示要聚合的特定接口,或者将公开未命名的接口列表。 在第一种情况下,仅向 对象发送适当的查询,在后一种情况下,所有与已支持的接口不匹配的查询将发送到此扩展对象。

扩展还可以通过支持 IDistributorNotify 接口来接收状态更改通知。 如果扩展对象支持此接口,则会在筛选器本身处理这些更改之前收到所有启动、停止和暂停状态更改的通知。 此外, IDistributorNotify::NotifyGraphChange 方法用于固定对象扩展,以指示 KS 引脚实例刚刚关闭。 此方法仅用于固定接口扩展,每次断开引脚连接或重新连接时,都会在扩展对象上调用此方法,而扩展对象仍由固定对象加载和聚合。

需要有关引脚连接更改的通知,因为当引脚断开连接时,扩展不会卸载。 而是在首次连接引脚时加载扩展,并通过断开连接和重新连接保持加载状态,除非重新连接指示引脚上不再支持特定扩展集。 此事实允许扩展对象在重新连接之间保留状态,但也意味着扩展可能需要有关 KS 引脚当前是否已连接的信息。 扩展可以通过调用 IKsObject::KsGetObjectHandle 方法来确定此信息,以便在扩展收到 NotifyGraphChange 调用时查询 KS 引脚的对象句柄。 首次加载扩展时,可以假定引脚已连接,并且任何后续通知都可能意味着断开连接或重新连接。 因此,通知发生在实际更改发生之后,而不是之前通知的状态更改。

集扩展基本上是一个 COM 服务器,可以选择公开 IDistributorNotify 接口和零个或多个其他聚合接口,筛选器的客户端可以使用这些接口来操作扩展对象表示的集。 在通过 CoCreateInstance 创建扩展对象的请求中,始终向服务器提供用于创建 COM 对象的外部 IUnknown 。 此 IUnknown 是正在加载集扩展的筛选器或引脚对象上的接口。 IUnknown 接口指针可用于从筛选器或引脚(例如 IKsControl)查询信息或接口。 但是,不应在外部对象上留下任何引用,因为这将导致循环引用计数。 使用没有引用计数的接口是可以接受的,因为扩展由外部对象聚合,根据定义,当外部对象的引用计数达到零时会销毁。

为了加载集扩展,代理会查找从筛选器或引脚收集的每个集的 GUID,以确定注册表中是否存在每个组。 要加载扩展的每个集的 GUID 为:

HKLM\System\CurrentControlSet\Control\MediaInterfaces\{set guid}

如果存在此子项,则集的 GUID 直接对应于 CoCreateInstance 调用的 COM 服务器参数中使用的 GUID。 每个子项还可以有一个命名的二进制值 iid,其中包含要为此集扩展聚合的接口的 GUID 的二进制表示形式。 这是接口 GUID,它将导致将筛选器或引脚上的 QueryInterface 发送到此扩展的 COM 服务器。 如果子项下不存在此命名值,则所有未知 的 QueryInterface 调用都将通过此扩展对象进行路由,从而允许它支持在基础对象上公开的特定集的许多接口。 集的 GUID 可以通过将 iid 设置为集的 GUID 或不设置 iid 值来用作接口标识符。 在后一种情况下,可能会将不支持的其他查询发送到扩展对象。

尽管 MediaInterfaces 注册表项可用于显式指示在提供程序聚合) (哪个接口,但不需要存在整个条目。 这意味着可以通过 IKsAggregateControl 加载任何 COM 服务器,以便此 COM 服务器提供聚合接口,无论 COM 服务器是否在 MediaInterfaces 注册表项下列出。

对于受支持且已定义扩展对象处理程序的集,这些扩展对象处理程序在安装时或在将特定类型的设备添加到系统时自动注册,驱动程序安装无需执行任何其他工作来公开这些 COM 接口以供其筛选器使用。 但是,若要公开专用集的 COM 接口,需要在安装筛选器时添加 MediaInterfaces 条目和 COM 服务器条目。

代理还允许筛选器替代 在 MediaInterfaces 下注册的集的 COM 服务器。 若要替代,请在 即插即用 接口注册表项下创建 SetAliases 项。 CLSIDFriendlyName 位于路径 HKLM\...\SetAliases 中

此外,输入命名值 {set guid},即设置 GUID 的字符串格式,作为替换 MediaInterfaces 子项的 GUID 的二进制值。 因此,对于此筛选器或此筛选器下的任何对象,具有此 GUID 的所有集都将使用此备用 GUID 来查找 MediaInterfaces 条目,而不是该集本身的 GUID。 新的 MediaInterfaces 条目将照常注册。

有关 IDistributorNotifyIUnknownCoCreateInstance 的详细信息,请参阅 Microsoft Windows SDK 文档。

要求

要求
目标平台 Windows
标头 ksproxy.h (包括 Ksproxy.h)

另请参阅

IKsControl

IKsObject::KsGetObjectHandle

KsAddAggregate

KsRemoveAggregate