Partilhar via


Pontos de conexão

Este artigo explica como implementar pontos de conexão (anteriormente conhecidos como pontos de conexão OLE) usando as classes CCmdTarget MFC e CConnectionPoint.

No passado, o Component Object Model (COM) definia um mecanismo geral (IUnknown::QueryInterface*) que permitia que os objetos implementassem e expusessem a funcionalidade em interfaces. No entanto, um mecanismo correspondente que permitia que os objetos expusessem sua capacidade de chamar interfaces específicas não foi definido. Ou seja, COM definiu como os ponteiros de entrada para objetos (ponteiros para as interfaces desse objeto) foram manipulados, mas não tinha um modelo explícito para interfaces de saída (ponteiros que o objeto mantém para interfaces de outros objetos). COM agora tem um modelo, chamado pontos de conexão, que suporta essa funcionalidade.

Uma conexão tem duas partes: o objeto que chama a interface, chamado de origem, e o objeto que implementa a interface, chamado coletor. Um ponto de conexão é a interface exposta pela fonte. Ao expor um ponto de conexão, uma fonte permite que os coletores estabeleçam conexões consigo mesma (a fonte). Através do mecanismo de ponto de conexão (a IConnectionPoint interface), um ponteiro para a interface de destino é passado para o objeto de origem. Esse ponteiro fornece à fonte acesso à implementação do recetáculo de um conjunto de funções membro. Por exemplo, para disparar um evento implementado pelo coletor, a fonte pode chamar o método apropriado de implementação do coletor. A figura a seguir demonstra o ponto de conexão que acabamos de descrever.

Diagrama mostrando um ponto de conexão implementado.
Um ponto de conexão implementado

MFC implementa esse modelo nas classes CConnectionPoint e CCmdTarget . Classes derivadas de CConnectionPoint implementam a interface IConnectionPoint, usada para expor pontos de conexão a outros objetos. Classes derivadas de CCmdTarget implementar a IConnectionPointContainer interface, que pode enumerar todos os pontos de conexão disponíveis de um objeto ou localizar um ponto de conexão específico.

Para cada ponto de conexão implementado em sua classe, você deve declarar uma parte de conexão que implementa o ponto de conexão. Se você implementar um ou mais pontos de conexão, também deverá declarar um único mapa de conexão em sua classe. Um mapa de conexão é uma tabela de pontos de conexão suportados pelo controle ActiveX.

Os exemplos a seguir demonstram um mapa de conexão simples e um ponto de conexão. O primeiro exemplo declara o mapa e o ponto de conexão; o segundo exemplo implementa o mapa e o ponto. Observe que CMyClass deve ser uma CCmdTargetclasse derivada. No primeiro exemplo, o código é inserido na declaração de classe, na protected seção:

class CMyClass : public CCmdTarget
{
protected:
   // Connection point for ISample interface
   BEGIN_CONNECTION_PART(CMyClass, SampleConnPt)
      CONNECTION_IID(IID_ISampleSink)
   END_CONNECTION_PART(SampleConnPt)

   DECLARE_CONNECTION_MAP()

As macros BEGIN_CONNECTION_PART e END_CONNECTION_PART declaram uma classe incorporada, XSampleConnPt (derivada de ), que implementa esse ponto de CConnectionPointconexão específico. Se você quiser substituir quaisquer CConnectionPoint funções de membro ou adicionar funções de membro próprias, declare-as entre essas duas macros. Por exemplo, a CONNECTION_IID macro substitui a CConnectionPoint::GetIID função de membro quando colocada entre essas duas macros.

No segundo exemplo, o código é inserido no arquivo de implementação do controle (arquivo .cpp). Este código implementa o mapa de conexão, que inclui o ponto de conexão, SampleConnPt:

BEGIN_CONNECTION_MAP(CMyClass, CCmdTarget)
    CONNECTION_PART(CMyClass, IID_ISampleSink, SampleConnPt)
END_CONNECTION_MAP()

Se sua classe tiver mais de um ponto de conexão, insira macros CONNECTION_PART adicionais entre as macros BEGIN_CONNECTION_MAP e END_CONNECTION_MAP .

Finalmente, adicione uma chamada para EnableConnections no construtor da classe. Por exemplo:

CMyClass::CMyClass()
{
   EnableConnections();
}

Depois que esse código tiver sido inserido, sua CCmdTargetclasse derivada expõe um ponto de conexão para a ISampleSink interface. A figura a seguir ilustra este exemplo.

Diagrama mostrando um ponto de conexão implementado usando MFC.
Um ponto de conexão implementado com MFC

Normalmente, os pontos de conexão suportam "multidifusão" — a capacidade de transmitir para vários recetores conectados à mesma interface. O fragmento de exemplo a seguir demonstra como fazer multicast iterando através de cada coletor em um ponto de conexão:

void CMyClass::CallSinkFunc()
{
   POSITION pos = m_xSampleConnPt.GetStartPosition();
   ISampleSink* pSampleSink;
   while (pos != NULL)
   {
      pSampleSink = (ISampleSink*)(m_xSampleConnPt.GetNextConnection(pos));
      if (pSampleSink != NULL)
         pSampleSink->SinkFunc();
   }
}

Este exemplo recupera o conjunto atual de conexões no SampleConnPt ponto de conexão com uma chamada para CConnectionPoint::GetConnections. Em seguida, ele percorre as conexões e chama ISampleSink::SinkFunc em todas as conexões ativas.

Ver também

MFC COM