Compartilhar via


Arquitetura de objetos conectáveis

O objeto conectável é apenas uma parte da arquitetura geral de objetos conectáveis. Esta tecnologia inclui os seguintes elementos:

As relações entre cliente, objeto conectável, um ponto de conexão e um coletor são ilustradas no diagrama a seguir:

Diagram that shows the connection points between the Client and Connectable Object.

Antes que o objeto de ponto de conexão chame métodos na interface do coletor na etapa 3 do diagrama anterior, ele deve QueryInterface para a interface específica necessária, mesmo que o ponteiro já tenha sido passado na chamada da etapa 2 para o método Advise .

Dois objetos enumeradores também estão envolvidos nessa arquitetura, embora não sejam mostrados na ilustração. Um é criado por um método em IConnectionPointContainer para enumerar os pontos de conexão dentro do objeto conectável. O outro é criado por um método em IConnectionPoint para enumerar as conexões atualmente estabelecidas para esse ponto de conexão. Um ponto de conexão pode oferecer suporte a várias interfaces de coletor conectadas e deve iterar pela lista de conexões sempre que fizer uma chamada de método nessa interface. Esse processo é conhecido como multicasting.

Ao trabalhar com objetos conectáveis, é importante entender que o objeto conectável, cada ponto de conexão, cada coletor e todos os enumeradores são objetos separados com implementações IUnknown separadas, contagens de referência separadas e tempos de vida separados. Um cliente que usa esses objetos é sempre responsável por liberar todas as contagens de referência que possui.

Observação

Um objeto conectável pode oferecer suporte a mais de um cliente e pode oferecer suporte a vários coletores em um cliente. Da mesma forma, um coletor pode ser conectado a mais de um objeto conectável.

 

As etapas para estabelecer uma conexão entre um cliente e um objeto conectável são as seguintes:

  1. O cliente consulta IConnectionPointContainer no objeto para determinar se o objeto é conectável. Se essa chamada for bem-sucedida, o cliente manterá um ponteiro para a interface IConnectionPointContainer no objeto conectável e o contador de referência de objeto conectável foi incrementado. Caso contrário, o objeto não é conectável e não oferece suporte a interfaces de saída.
  2. Se o objeto for conectável, o cliente tentará obter um ponteiro para a interface IConnectionPoint em um ponto de conexão dentro do objeto conectável. Há dois métodos para obter esse ponteiro, ambos em IConnectionPointContainer::FindConnectionPoint e em IConnectionPointContainer::EnumConnectionPoints. Há algumas etapas adicionais necessárias se EnumConnectionPoints for usado. (Veja Usando IConnectionPointContainer para obter mais informações.) Se for bem-sucedido, o objeto conectável e o cliente oferecem suporte à mesma interface de saída. O objeto conectável o define e o chama, e o cliente o implementa. O cliente pode então se comunicar através do ponto de conexão dentro do objeto conectável.
  3. Em seguida, o cliente chama Advise no ponto de conexão para estabelecer uma conexão entre sua interface de coletor e o ponto de conexão do objeto. Após essa chamada, o ponto de conexão do objeto mantém um ponteiro para a interface de saída no coletor.
  4. O código dentro de Advise chama QueryInterface no ponteiro de interface que é passado, solicitando o identificador de interface específico ao qual ele se conecta.
  5. O objeto chama métodos na interface do coletor conforme necessário, usando o ponteiro mantido por seu ponto de conexão.
  6. O cliente chama Unadvise para encerrar a conexão. Em seguida, o cliente chama IConnectionPoint::Release para liberar sua retenção no ponto de conexão e, portanto, o objeto conectável principal também. O cliente também deve chamar IConnectionPointContainer::Release para liberar sua retenção no objeto conectável principal.

Interfaces de objetos conectáveis