Compartir a través de


Puntos de conexión

En este artículo se explica cómo implementar puntos de conexión (anteriormente conocidos CCmdTarget como puntos de conexión OLE) mediante las clases MFC y CConnectionPoint.

En el pasado, el modelo de objetos componentes (COM) definió un mecanismo general (IUnknown::QueryInterface*) que permitía a los objetos implementar y exponer la funcionalidad en las interfaces. Sin embargo, no se definió un mecanismo correspondiente que permitía a los objetos exponer su capacidad para llamar a interfaces específicas. Es decir, COM definió cómo se controlaron los punteros entrantes a objetos (punteros a las interfaces de ese objeto), pero no tenía un modelo explícito para las interfaces salientes (punteros que contiene el objeto a las interfaces de otros objetos). COM ahora tiene un modelo, denominado puntos de conexión, que admite esta funcionalidad.

Una conexión tiene dos partes: el objeto que llama a la interfaz, denominado origen y el objeto que implementa la interfaz, denominado receptor. Un punto de conexión es la interfaz expuesta por el origen. Al exponer un punto de conexión, un origen permite a los receptores establecer conexiones a sí mismas (el origen). A través del mecanismo de punto de conexión (la IConnectionPoint interfaz), se pasa un puntero a la interfaz receptora al objeto de origen. Este puntero proporciona al origen acceso a la implementación del receptor de un conjunto de funciones miembro. Por ejemplo, para desencadenar un evento implementado por el receptor, el origen puede llamar al método adecuado de la implementación del receptor. En la ilustración siguiente se muestra el punto de conexión que acaba de describir.

Diagrama que muestra un punto de conexión implementado.
Un punto de conexión implementado

MFC implementa este modelo en las clases CConnectionPoint y CCmdTarget . Las clases derivadas de CConnectionPoint implementan la IConnectionPoint interfaz, que se usan para exponer puntos de conexión a otros objetos. Las clases derivadas de CCmdTarget implementan la IConnectionPointContainer interfaz , que pueden enumerar todos los puntos de conexión disponibles de un objeto o buscar un punto de conexión específico.

Para cada punto de conexión implementado en la clase , debe declarar un elemento de conexión que implemente el punto de conexión. Si implementa uno o varios puntos de conexión, también debe declarar un único mapa de conexión en la clase . Un mapa de conexión es una tabla de puntos de conexión admitidos por el control ActiveX.

En los ejemplos siguientes se muestra un mapa de conexión simple y un punto de conexión. En el primer ejemplo se declara el mapa de conexión y el punto; en el segundo ejemplo se implementa el mapa y el punto. Tenga en cuenta que CMyClass debe ser una CCmdTargetclase derivada de . En el primer ejemplo, el código se inserta en la declaración de clase, en la protected sección :

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()

Las macros BEGIN_CONNECTION_PART y END_CONNECTION_PART declaran una clase incrustada ( XSampleConnPt derivada de ), que implementa este punto de CConnectionPointconexión determinado. Si desea invalidar cualquier CConnectionPoint función miembro o agregar funciones miembro propias, declárelas entre estas dos macros. Por ejemplo, la CONNECTION_IID macro invalida la CConnectionPoint::GetIID función miembro cuando se coloca entre estas dos macros.

En el segundo ejemplo, el código se inserta en el archivo de implementación del control (.cpp archivo). Este código implementa el mapa de conexión, que incluye el punto de conexión, SampleConnPt:

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

Si la clase tiene más de un punto de conexión, inserte macros de CONNECTION_PART adicionales entre las macros BEGIN_CONNECTION_MAP y END_CONNECTION_MAP .

Por último, agregue una llamada a EnableConnections en el constructor de la clase. Por ejemplo:

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

Una vez insertado este código, CCmdTargetla clase derivada de -expone un punto de conexión para la ISampleSink interfaz. En la siguiente figura, se ilustra este ejemplo.

Diagrama que muestra un punto de conexión implementado mediante MFC.
Un punto de conexión implementado con MFC

Normalmente, los puntos de conexión admiten "multidifusión", la capacidad de difundir a varios receptores conectados a la misma interfaz. En el fragmento de ejemplo siguiente se muestra cómo realizar una iteración mediante la iteración a través de cada receptor en un punto de conexión:

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

En este ejemplo se recupera el conjunto actual de conexiones en el SampleConnPt punto de conexión con una llamada a CConnectionPoint::GetConnections. A continuación, recorre en iteración las conexiones y las llamadas ISampleSink::SinkFunc en cada conexión activa.

Consulte también

MFC COM