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 调用,从而允许它支持基础对象上公开的特定集的许多接口。 可以通过将 iid 设置为集的 GUID 或未设置 iid 值来将集的 GUID 用作接口标识符。 在后一种情况下,不支持的其他查询可能会发送到扩展对象。

尽管 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 文档。

要求

要求 价值
目标平台 窗户
标头 ksproxy.h (包括 Ksproxy.h)

另请参阅

IKsControl

IKsObject::KsGetObjectHandle

KsAddAggregate

KsRemoveAggregate