Classe CConnectionPoint
Define um tipo especial de interface usado para se comunicar com outros objetos OLE, chamado de "ponto de conexão".
Sintaxe
class CConnectionPoint : public CCmdTarget
Membros
Construtores públicos
Nome | Descrição |
---|---|
CConnectionPoint::CConnectionPoint | Constrói um objeto CConnectionPoint . |
Métodos públicos
Nome | Descrição |
---|---|
CConnectionPoint::GetConnections | Recupera todos os pontos de conexão em um mapa de conexão. |
CConnectionPoint::GetContainer | Recupera o contêiner do controle que detém o mapa de conexão. |
CConnectionPoint::GetIID | Recupera a ID da interface de um ponto de conexão. |
CConnectionPoint::GetMaxConnections | Recupera o número máximo de pontos de conexão com suporte em um controle. |
CConnectionPoint::GetNextConnection | Recupera um ponteiro para o elemento de conexão em pos. |
CConnectionPoint::GetStartPosition | Inicia uma iteração de mapa retornando um valor POSITION que pode ser passado para uma chamada GetNextConnection . |
CConnectionPoint::OnAdvise | Chamado pela estrutura ao estabelecer ou interromper conexões. |
CConnectionPoint::QuerySinkInterface | Recupera um ponteiro para a interface do coletor solicitada. |
Comentários
Ao contrário das interfaces OLE normais, que são usadas para implementar e expor a funcionalidade de um controle OLE, um ponto de conexão implementa uma interface de saída capaz de iniciar ações em outros objetos, como disparar eventos e alterar notificações.
Uma conexão consiste em duas partes: o objeto que chama a interface, chamado de "origem" e o objeto que implementa a interface, chamado de "coletor". Ao expor um ponto de conexão, uma fonte permite que os coletores estabeleçam conexões para si mesmos. Por meio do mecanismo de ponto de conexão, um objeto de origem obtém um ponteiro para a 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.
Por padrão, uma classe derivada de COleControl
implementa dois pontos de conexão: um para eventos e outro para notificações de alteração de propriedade. Essas conexões são usadas, respectivamente, para disparo de eventos e para notificar um coletor (por exemplo, o contêiner do controle) quando um valor da propriedade foi alterado. Também há suporte para fornecido para controles OLE implementarem pontos de conexão adicionais. Para cada ponto de conexão adicional implementado em sua classe de controle, 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 precisará declarar um só "mapa de conexão" em sua classe de controle.
O exemplo a seguir demonstra um mapa de conexão simples e um ponto de conexão para o controle OLE Sample
, que consiste em dois fragmentos de código: a primeira parte declara o mapa e o ponto de conexão; a segunda implementa esse mapa e ponto. O primeiro fragmento é inserido na declaração da classe de controle, na seção 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 CConnectionPoint
) que implementa esse ponto de conexão específico. Se você quiser substituir qualquer função de membro CConnectionPoint
ou adicionar funções de membro próprias, declare-as entre essas duas macros. Por exemplo, a macro CONNECTION_IID substitui a função de membro CConnectionPoint::GetIID
quando colocada entre essas duas macros.
O segundo fragmento de código é inserido no arquivo de implementação (.CPP) da classe de controle. Esse código implementa o mapa de conexão, que inclui o ponto de conexão adicional: SampleConnPt
BEGIN_CONNECTION_MAP(CMyClass, CCmdTarget)
CONNECTION_PART(CMyClass, IID_ISampleSink, SampleConnPt)
END_CONNECTION_MAP()
Depois que esses fragmentos de código são inseridos, o controle OLE de exemplo expõe um ponto de conexão para a interface ISampleSink
.
Normalmente, os pontos de conexão dão suporte a "multicasting", que é a capacidade de difusão para vários coletores conectados à mesma interface. O seguinte fragmento de código demonstra como realizar multicasting iterando em 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 ponto de conexão SampleConnPt
com uma chamada para CConnectionPoint::GetConnections
. Em seguida, itera pelas conexões e chama ISampleSink::SinkFunc
em todas as conexões ativas.
Para mais informações sobre como usar CConnectionPoint
, confira o artigo Pontos de Conexão.
Hierarquia de herança
CConnectionPoint
Requisitos
Cabeçalho afxdisp.h
CConnectionPoint::CConnectionPoint
Constrói um objeto CConnectionPoint
.
CConnectionPoint();
CConnectionPoint::GetConnections
Chame essa função para recuperar todas as conexões ativas para um ponto de conexão.
const CPtrArray* GetConnections();
Valor de retorno
Um ponteiro para uma matriz de conexões ativas (coletores). Alguns dos ponteiros na matriz podem ser NULL. Cada ponteiro não NULL nessa matriz pode ser convertido com segurança em um ponteiro para a interface do coletor usando um operador de conversão.
CConnectionPoint::GetContainer
Chamado pela estrutura para recuperar o ponto de conexão IConnectionPointContainer
.
virtual LPCONNECTIONPOINTCONTAINER GetContainer();
Valor de retorno
Se tiver êxito, um ponteiro para o contêiner; caso contrário, NULL.
Comentários
Essa função normalmente é implementada pela macro BEGIN_CONNECTION_PART.
CConnectionPoint::GetIID
Chamada pela estrutura para recuperar a ID da interface de um ponto de conexão.
virtual REFIID GetIID() = 0;
Valor de retorno
Uma referência à ID da interface do ponto de conexão.
Comentários
Substitua essa função para retornar a ID da interface para esse ponto de conexão.
CConnectionPoint::GetMaxConnections
Chamada pela estrutura para recuperar o número máximo de conexões compatíveis com o ponto de conexão.
virtual int GetMaxConnections();
Valor de retorno
O número máximo de conexões compatíveis com o controle ou -1 se não houver limite.
Comentários
A implementação padrão retorna -1, indicando que não há limite.
Substitua essa função se você quiser limitar o número de coletores que podem se conectar ao seu controle.
CConnectionPoint::GetNextConnection
Recupera um ponteiro para o elemento de conexão em pos.
LPUNKNOWN GetNextConnection(POSITION& pos) const;
Parâmetros
pos
Especifica uma referência a um valor POSITION retornado por uma chamada GetNextConnection
ou GetStartPosition anterior.
Valor de retorno
Um ponteiro para o elemento de conexão especificado por pos ou NULL.
Comentários
Essa função é mais útil para iterar todos os elementos no mapa de conexão. Ao iterar, ignore todos os NULLs retornados dessa função.
Exemplo
void CMyClass::CallSinkFunc()
{
POSITION pos = m_xSampleConnPt.GetStartPosition();
ISampleSink *pSampleSink;
while (pos != NULL)
{
pSampleSink = (ISampleSink *)(m_xSampleConnPt.GetNextConnection(pos));
if (pSampleSink != NULL)
{
pSampleSink->SinkFunc();
}
}
}
CConnectionPoint::GetStartPosition
Inicia uma iteração de mapa retornando um valor POSITION que pode ser passado para uma chamada GetNextConnection.
POSITION GetStartPosition() const;
Valor de retorno
Um valor POSITION que indica uma posição inicial para iterar o mapa; ou NULL se o mapa estiver vazio.
Comentários
A sequência de iteração não é previsível; portanto, o "primeiro elemento no mapa" não tem significado especial.
Exemplo
Confira o exemplo de CConnectionPoint::GetNextConnection.
CConnectionPoint::OnAdvise
Chamado pela estrutura quando uma conexão está sendo estabelecida ou interrompida.
virtual void OnAdvise(BOOL bAdvise);
Parâmetros
bAdvise
TRUE, se uma conexão estiver sendo estabelecida; caso contrário, FALSE.
Comentários
A implementação padrão não tem ação.
Substitua essa função se você quiser notificação quando os coletores se conectarem ou se desconectarem do ponto de conexão.
CConnectionPoint::QuerySinkInterface
Recupera um ponteiro para a interface do coletor solicitada.
virtual HRESULT QuerySinkInterface(
LPUNKNOWN pUnkSink,
void** ppInterface);
Parâmetros
pUnkSink
O identificador da interface do coletor que está sendo solicitada.
ppInterface
Um ponteiro para o ponteiro da interface identificado por pUnkSink. Se o objeto não der suporte a essa interface, * ppInterface será definida como NULL.
Valor de retorno
Um valor HRESULT padrão.