Compartilhar via


Pontos de conexão

Este artigo explica sistema autônomo implementar pontos de conexão (anteriormente conhecidos sistema autônomo pontos de conexão OLE) usar o MFC classes CCmdTarget e CConnectionPoint.

No passado, COM (componente objeto Model) definido um mecanismo geral (IUnknown::QueryInterface) objetos para implementar e expor a funcionalidade nas interfaces que permitido.No entanto, objetos de um mecanismo correspondente que pode expor sua capacidade de telefonar interfaces específicas não foi definido.Ou seja, COM definido como entrados ponteiros para objetos (ponteiros para interfaces desse objeto) foram tratados mas ele não possui um modelo explícito para interfaces de saída (ponteiros mantém o objeto para interfaces de outros objetos).COM agora tem um modelo chamado pontos de conexão, que oferece suporte a essa funcionalidade.

Uma conexão tem duas partes: o objeto chamando a interface, chamado a fonte e o objeto de implementação da interface, chamado de coletor.Um ponto de conexão é a interface exposta por fonte.Ao expor um ponto de conexão, uma fonte permite PIAs estabelecer conexões a mesmo (a origem).Através do mecanismo de ponto de conexão (o IConnectionPoint interface), um ponteiro para a interface de coletor é passado para o objeto de fonte.Esse ponteiro fornece a fonte com acesso à implementação do coletor de um conjunto de funções de membro.Por exemplo, para acionar um evento implementado pelo coletor, fonte 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

MFC implementa esse modelo no CConnectionPoint and 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ível 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 MAP de conexão única em sua classe.Um MAP de conexão é uma tabela de pontos de conexão suportados pelo controle ActiveX.

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

The BEGIN_CONNECTION_PART e END_CONNECTION_PART macros declarar uma classe incorporada, XSampleConnPt (derivado de CConnectionPoint), que implementa esse ponto de conexão específica. Se você desejar substituir qualquer CConnectionPoint funções de membro ou adicionar funções de membro de sua preferência, declará-los entre essas duas macros. Por exemplo, a CONNECTION_IID macro substitui o CConnectionPoint::GetIID função de membro ao ser colocado 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 MAP 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 um ponto de conexão, insira adicionais CONNECTION_PART macros entre o BEGIN_CONNECTION_MAP e END_CONNECTION_MAP macros.

Por fim, adicione uma telefonar 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

Normalmente, pontos de conexão oferecem suporte à "difundido seletiva" — a capacidade de transmissão para vários receptores conectado à mesma interface.O fragmento de exemplo a seguir demonstra como multicast por iteração cada receptor de 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 corrente de conexões no SampleConnPt ponto de conexão com uma telefonar para CConnectionPoint::GetConnections. Em seguida, itera através de conexões e chama ISampleSink::SinkFunc em cada conexão ativo.

Consulte também

Conceitos

MFC COM.