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:
- Objeto conectável. Implementa a interface IConnectionPointContainer , cria pelo menos um objeto de ponto de conexão, define uma interface de saída para o cliente.
- Cliente. Consulta o objeto para IConnectionPointContainer para determinar se o objeto é conectável; cria um objeto coletor para implementar a interface de saída definida pelo objeto conectável.
- Objeto de coletor. Implementa a interface de saída; usado para estabelecer uma conexão com o objeto conectável.
- Objeto de ponto de conexão. Implementa a interface IConnectionPoint e gerencia a conexão com o coletor do cliente.
As relações entre cliente, objeto conectável, um ponto de conexão e um coletor são ilustradas no diagrama a seguir:
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:
- 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.
- 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.
- 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.
- 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.
- O objeto chama métodos na interface do coletor conforme necessário, usando o ponteiro mantido por seu ponto de conexão.
- 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.
Tópicos relacionados