Compartilhar 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 MFC CCmdTarget e CConnectionPoint.

No passado, o modelo de objeto componente (COM) definido um mecanismo geral (IUnknown::QueryInterface) que permitidos objetos implementar e expor a funcionalidade em interfaces.No entanto, não foi definido um mecanismo correspondente que permitidos objetos para expor a capacidade de chamar interfaces específicas.Ou seja, COM definido como entrados ponteiros para objetos (ponteiros para interfaces do objeto) foram tratados, mas não tinha um modelo explícito para interfaces de saída (ponteiros o objeto contém interfaces de outros objetos).COM agora tem um modelo chamado pontos de conexão, que suporta esta funcionalidade.

Uma conexão tem duas partes: o objeto chamar a interface, chamada de origem e o objeto implementar a interface, chamado o coletor.Um ponto de conexão é a interface exposta pela origem.Ao expor um ponto de conexão, uma fonte permite coletores estabelecer conexões a mesmo (a origem).Através da conexão aponte mecanismo (o IConnectionPoint interface), um ponteiro para a interface de coletor é passado para o objeto de origem.Esse ponteiro fornece a fonte de acesso a implementação do coletor de um conjunto de funções de membro.Por exemplo, para acionar um evento implementado pelo coletor, a origem pode chamar o método apropriado de implementação do coletor.A figura a seguir demonstra a conexão de ponto que acabamos de descrever.

Um ponto de conexão implementado

Ponto de conexão implementado

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

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

Os exemplos seguintes demonstram um mapa de conexão simples e um ponto de conexão.O primeiro exemplo declara o mapa de conexão e o ponto; o segundo exemplo implementa o mapa e o ponto.Observe que CMyClass deve ser um CCmdTarget-classe derivada.No primeiro exemplo, o código é inserido na declaração da classe na protegido 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()

O BEGIN_CONNECTION_PART e END_CONNECTION_PART macros declare uma classe incorporada, XSampleConnPt (derivado de CConnectionPoint), que implementa esta conexão de determinado ponto.Se você desejar substituir qualquer CConnectionPoint funções de membro ou adicionar funções de membro de sua preferência, declare-los entre essas duas macros.Por exemplo, o CONNECTION_IID macro substitui o CConnectionPoint::GetIID função de membro quando colocados 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 da 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 tem mais de uma conexão ponto, inserir adicionais CONNECTION_PART macros entre o BEGIN_CONNECTION_MAP e END_CONNECTION_MAP macros.

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

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

Depois que esse código foi inserido, o CCmdTarget-classe derivada expõe um ponto de conexão para o ISampleSink interface.A figura a seguir ilustra esse exemplo.

Um ponto de conexão implementado com MFC

MFC de implementação de ponto de conexão

Normalmente, os pontos de conexão suportam "multicast" — a capacidade de transmissão para vários coletores conectados à mesma interface.O fragmento de exemplo a seguir demonstra como multicast por iteração 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 de conexões e chamadas ISampleSink::SinkFunc em cada conexão ativa.

Consulte também

Conceitos

COM MFC