Compartir a través de


Interfaz IKsAggregateControl (ksproxy.h)

La interfaz IKsAggregateControl proporciona métodos que agregan y quitan servidores COM como proveedores agregados en objetos KS que admiten la interfaz.

El identificador de interfaz (IID) de esta interfaz es IID_IKsAggregateControl.

Herencia

La interfaz IKsAggregateControl hereda de la interfaz IUnknown .

Métodos

La interfaz IKsAggregateControl tiene estos métodos.

 
IKsAggregateControl::KsAddAggregate

El método KsAddAggregate agrega un servidor COM como proveedor agregado a la lista de proveedores de interfaz para el objeto KS que expone la interfaz IKsAggregateControl.
IKsAggregateControl::KsRemoveAggregate

El método KsRemoveAggregate quita un proveedor de agregado de servidor COM agregado previamente de la lista de proveedores de interfaz para el objeto KS que expone la interfaz IKsAggregateControl.

Comentarios

Todos los conjuntos de propiedades, métodos y eventos que admite un filtro o patilla KS se pueden representar en la representación de proxy DirectShow del objeto de filtro o anclaje en cero o más interfaces, diálogos agregados, etc. Estas interfaces agregadas de cliente se establecen extensiones que se pueden usar para comunicarse con el objeto KS subyacente con el fin de representar la funcionalidad del conjunto. Una extensión set es un servidor COM registrado, que se carga a través de CoCreateInstance mediante el filtro o la patilla KS en el momento de la creación del identificador.

El propósito principal de las extensiones de conjunto es permitir la agregación de interfaces para admitir algún conjunto a través de una o varias interfaces COM. Sin embargo, una implementación también puede incluir compatibilidad con diálogos, procesamiento asincrónico en subprocesos, etc. El registro de un controlador de conjuntos permite indicar una interfaz específica que se va a agregar o que se expondrá una lista sin nombre de interfaces. En el primer caso, solo se envían las consultas adecuadas al objeto y, en este último, todas las consultas que no coinciden con una interfaz ya admitida se envían a este objeto de extensión.

Una extensión también puede recibir notificaciones de cambios de estado al admitir la interfaz IDistributorNotify . Si el objeto de extensión admite esta interfaz, se le notificarán todos los cambios de estado de inicio, detención y pausa antes de que el propio filtro procese esos cambios. Además, el método IDistributorNotify::NotifyGraphChange se usa en extensiones de objeto pin para indicar que la instancia de pin KS acaba de cerrarse. Este método solo se usa para las extensiones de interfaz de anclaje y se llama a en un objeto de extensión cada vez que el pin se desconecta o se vuelve a conectar, mientras que el objeto de extensión sigue cargado y agregado por el objeto pin.

Se requiere notificación sobre los cambios de conexión de anclaje porque las extensiones no se descargan cuando se desconecta un pin. En su lugar, las extensiones se cargan la primera vez que se conecta el pin y se cargan a través de desconexiones y reconexión, a menos que una reconexión indique que el conjunto de extensiones concreto no se admite en la patilla más tiempo. Este hecho permite que un objeto de extensión conserve el estado entre las reconexión, pero también significa que una extensión puede requerir información sobre si el pin KS está conectado actualmente. La extensión puede determinar esta información llamando al método IKsObject::KsGetObjectHandle para consultar el identificador de objeto del pin KS cuando la extensión recibe una llamada NotifyGraphChange . Cuando la extensión se carga por primera vez, puede suponer que el pin está conectado y cualquier notificación posterior puede implicar una desconexión o reconexión. Por lo tanto, la notificación se produce después de que se produzca el cambio real, en lugar de los cambios de estado, que notifican antes.

Una extensión set es básicamente un servidor COM que, opcionalmente, expone la interfaz IDistributorNotify y cero o más interfaces agregadas que un cliente del filtro puede usar para manipular conjuntos que representa el objeto de extensión. En una solicitud de creación de objetos de extensión a través de CoCreateInstance, el servidor siempre presenta un IUnknown externo con el que crear el objeto COM. Este IUnknown es una interfaz en el objeto filter o pin que está cargando extensiones de conjunto. El puntero de interfaz IUnknown se puede usar para consultar información o interfaces desde el filtro o el pin, como IKsControl. Sin embargo, no se debe dejar ninguna referencia en el objeto externo, ya que dará como resultado un recuento de referencias circular. El uso de las interfaces sin un recuento de referencias es aceptable, ya que la extensión se agrega mediante el objeto externo y, por definición, se destruye cuando el recuento de referencias del objeto externo alcanza cero.

Para cargar extensiones de conjunto, el proxy busca el GUID de cada conjunto recopilado del filtro o el pin, determinando si cada uno está presente en el registro. El GUID de cada conjunto que va a tener una extensión cargada es:

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

Si esta subclave está presente, el GUID del conjunto corresponde directamente al GUID utilizado en el parámetro del servidor COM de la llamada a CoCreateInstance . Cada subclave también puede tener un valor binario con nombre iid que contenga la representación binaria del GUID para que la interfaz se agregue para esta extensión de conjunto. Este es el GUID de interfaz que hará que un QueryInterface en el filtro o el pin se envíen al servidor COM para esta extensión. Si este valor con nombre no está presente en la subclave, todas las llamadas a QueryInterface desconocidas se enrutarán a través de este objeto de extensión, lo que le permite admitir muchas interfaces para un conjunto determinado expuesto en el objeto subyacente. El GUID del conjunto se puede usar como identificador de interfaz estableciendo iid para que sea el GUID del conjunto o no estableciendo un valor iid. En este último caso, se pueden enviar consultas adicionales no admitidas al objeto de extensión.

Aunque la clave del Registro MediaInterfaces se puede usar para indicar explícitamente qué interfaz (si existe) que agrega el proveedor, no es necesario que esté presente toda la entrada. Implicación de que cualquier servidor COM se puede cargar a través de IKsAggregateControl para que este servidor COM proporcione interfaces agregadas, si el servidor COM aparece en la clave del Registro MediaInterfaces .

En el caso de los conjuntos admitidos y que ya tienen controladores de objetos de extensión definidos que se registran automáticamente en el momento de la instalación o cuando se agrega un tipo específico de dispositivo al sistema, la instalación del controlador no necesita realizar ningún trabajo adicional para exponer estas interfaces COM para su filtro. Sin embargo, para exponer interfaces COM para conjuntos privados, es necesario agregar la entrada MediaInterfaces y la entrada del servidor COM cuando se instala el filtro.

El proxy también permite que un filtro invalide el servidor COM para un conjunto registrado en MediaInterfaces. Para invalidar, cree una clave SetAliases en la clave del Registro de Plug and Play interfaz. CLSID y FriendlyName se encuentran en la ruta HKLM\...\SetAliases.

Además, escriba el valor con nombre {set guid}, que es el formato de cadena del GUID establecido, como el valor binario del GUID para la subclave MediaInterfaces de reemplazo. Por lo tanto, para este filtro o cualquier objeto bajo este filtro, todos los conjuntos con este GUID usarán este GUID alternativo para buscar una entrada MediaInterfaces en lugar del GUID del propio conjunto. La nueva entrada MediaInterfaces se registraría como de costumbre.

Para obtener más información sobre IDistributorNotify, IUnknown y CoCreateInstance, consulte la documentación de Microsoft Windows SDK.

Requisitos

Requisito Value
Plataforma de destino Windows
Encabezado ksproxy.h (incluya Ksproxy.h)

Consulte también

IKsControl

IKsObject::KsGetObjectHandle

KsAddAggregate

KsRemoveAggregate