Compartir a través de


Arquitectura de objetos conectables

El objeto conectable es solo una parte de la arquitectura general de objetos conectables. Esta tecnología incluye los siguientes elementos:

  • Objeto conectable. Implementa la interfaz IConnectionPointContainer ; crea al menos un objeto de punto de conexión; define una interfaz saliente para el cliente.
  • Cliente. Consulta el objeto para IConnectionPointContainer para determinar si el objeto es conectable; crea un objeto receptor para implementar la interfaz saliente definida por el objeto conectable.
  • Objeto sink. Implementa la interfaz saliente; se usa para establecer una conexión con el objeto conectable.
  • Objeto de punto de conexión. Implementa la interfaz IConnectionPoint y administra la conexión con el receptor del cliente.

Las relaciones entre el cliente, el objeto conectable, un punto de conexión y un receptor se muestran en el diagrama siguiente:

Diagrama que muestra los puntos de conexión entre el cliente y el objeto conectable.

Antes de que el objeto de punto de conexión llame a los métodos de la interfaz receptor en el paso 3 del diagrama anterior, debe consultarInterface para la interfaz específica necesaria, incluso si el puntero ya se pasó en la llamada del paso 2 al método Advise .

Dos objetos de enumerador también están implicados en esta arquitectura, aunque no se muestran en la ilustración. Uno se crea mediante un método en IConnectionPointContainer para enumerar los puntos de conexión dentro del objeto conectable. El otro se crea mediante un método de IConnectionPoint para enumerar las conexiones establecidas actualmente en ese punto de conexión. Un punto de conexión puede admitir varias interfaces de receptor conectadas y debe recorrer en iteración la lista de conexiones cada vez que realiza una llamada de método en esa interfaz. Este proceso se conoce como multidifusión.

Al trabajar con objetos conectables, es importante comprender que el objeto conectable, cada punto de conexión, cada receptor y todos los enumeradores son objetos independientes con implementaciones IUnknown independientes, recuentos de referencia independientes y duraciones independientes. Un cliente que usa estos objetos siempre es responsable de liberar todos los recuentos de referencia que posee.

Nota

Un objeto conectable puede admitir más de un cliente y puede admitir varios receptores dentro de un cliente. Del mismo modo, un receptor se puede conectar a más de un objeto conectable.

 

Los pasos para establecer una conexión entre un cliente y un objeto conectable son los siguientes:

  1. El cliente consulta IConnectionPointContainer en el objeto para determinar si el objeto se puede conectar. Si esta llamada se realiza correctamente, el cliente contiene un puntero a la interfaz IConnectionPointContainer en el objeto conectable y se ha incrementado el contador de referencia de objeto conectable. De lo contrario, el objeto no se puede conectar y no admite interfaces salientes.
  2. Si el objeto se puede conectar, el cliente intenta obtener un puntero a la interfaz IConnectionPoint en un punto de conexión dentro del objeto conectable. Hay dos métodos para obtener este puntero, tanto en IConnectionPointContainer::FindConnectionPoint como en IConnectionPointContainer::EnumConnectionPoints. Hay algunos pasos adicionales necesarios si se usa EnumConnectionPoints . (Vea Usar IConnectionPointContainer para obtener más información). Si se ejecuta correctamente, el objeto conectable y el cliente admiten la misma interfaz saliente. El objeto conectable lo define y lo llama, y el cliente lo implementa. Después, el cliente puede comunicarse a través del punto de conexión dentro del objeto conectable.
  3. A continuación, el cliente llama a Advise en el punto de conexión para establecer una conexión entre su interfaz receptora y el punto de conexión del objeto. Después de esta llamada, el punto de conexión del objeto contiene un puntero a la interfaz saliente del receptor.
  4. El código de Advise llama a QueryInterface en el puntero de interfaz que se pasa y solicita el identificador de interfaz específico al que se conecta.
  5. El objeto llama a métodos en la interfaz del receptor según sea necesario, utilizando el puntero mantenido por su punto de conexión.
  6. El cliente llama a Unadvise para finalizar la conexión. A continuación, el cliente llama a IConnectionPoint::Release para liberar su suspensión en el punto de conexión y, por lo tanto, el objeto conectable principal también. El cliente también debe llamar a IConnectionPointContainer::Release para liberar su suspensión en el objeto conectable principal.

Interfaces de objeto conectables