Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
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 COM (Component Object Model) definia um mecanismo geral (IUnknown::QueryInterface*) que permitia aos objetos implementar e expor a funcionalidade em interfaces. No entanto, um mecanismo correspondente que permitia aos objetos expor sua capacidade de chamar interfaces específicas não foi definido. Ou seja, COM definiu como ponteiros de entrada para objetos (ponteiros para as interfaces desse objeto) foram tratados, mas não tinha um modelo explícito para interfaces de saída (ponteiros que o objeto contém para interfaces de outros objetos). O COM agora tem um modelo, chamado de pontos de conexão, que dá suporte a 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 origem. Ao expor um ponto de conexão, uma origem permite que os coletores estabeleçam conexões para si mesmo (a origem). Por meio do mecanismo de ponto de conexão (a IConnectionPoint interface), um ponteiro para a interface do coletor é passado para o objeto de origem. Esse ponteiro fornece à fonte acesso à implementação do coletor de um conjunto de funções de membro. Por exemplo, para disparar um evento implementado pelo coletor, a origem pode chamar o método apropriado da implementação do coletor. A figura a seguir demonstra o ponto de conexão descrito.
Um ponto de conexão implementado
O MFC implementa esse modelo nas classes CConnectionPoint e CCmdTarget . Classes derivadas da CConnectionPoint implementação da IConnectionPoint interface, usadas para expor pontos de conexão a outros objetos. Classes derivadas da CCmdTarget implementação da IConnectionPointContainer interface, que podem enumerar todos os pontos de conexão disponíveis de um objeto ou encontrar 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 implemente 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 compatível com o 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 inserida ( 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 membro próprias, declare-as entre essas duas macros. Por exemplo, a CONNECTION_IID macro substitui a CConnectionPoint::GetIID função membro quando colocada entre essas duas macros.
No segundo exemplo, o código é inserido no arquivo de implementação do controle (arquivo .cpp). Esse 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 a classe tiver mais de um ponto de conexão, insira macros de CONNECTION_PART adicionais entre as macros BEGIN_CONNECTION_MAP e END_CONNECTION_MAP .
Por fim, adicione uma chamada ao EnableConnections construtor da classe. Por exemplo:
CMyClass::CMyClass()
{
EnableConnections();
}
Depois que esse código é inserido, sua CCmdTargetclasse derivada expõe um ponto de conexão para a ISampleSink interface. A figura a seguir ilustra esse exemplo.
Um ponto de conexão implementado com o MFC
Normalmente, os pontos de conexão dão suporte a "multicasting" – a capacidade de transmitir para vários coletores conectados à mesma interface. O fragmento de exemplo a seguir demonstra como fazer o multicast iterando por meio 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, itera por meio das conexões e chamadas ISampleSink::SinkFunc em todas as conexões ativas.