CConnectionPoint (clase)

Define un tipo especial de interfaz que se utiliza para comunicarse con otros objetos OLE, denominado "punto de conexión".

Sintaxis

class CConnectionPoint : public CCmdTarget

Miembros

Constructores públicos

Nombre Descripción
CConnectionPoint::CConnectionPoint Construye un objeto CConnectionPoint.

Métodos públicos

Nombre Descripción
CConnectionPoint::GetConnections Recupera todos los puntos de conexión de un mapa de conexiones.
CConnectionPoint::GetContainer Recupera el contenedor del control que posee el mapa de conexiones.
CConnectionPoint::GetIID Recupera el id. de interfaz de un punto de conexión.
CConnectionPoint::GetMaxConnections Recupera el número máximo de puntos de conexión admitidos por un control.
CConnectionPoint::GetNextConnection Recupera un puntero al elemento de conexión en pos.
CConnectionPoint::GetStartPosition Inicia una iteración de mapa mediante la devolución de un valor POSITION que se puede pasar a una llamada a GetNextConnection.
CConnectionPoint::OnAdvise Lo llama el marco al establecer o interrumpir las conexiones.
CConnectionPoint::QuerySinkInterface Recupera un puntero a la interfaz receptora solicitada.

Comentarios

A diferencia de las interfaces OLE normales, que se usan para implementar y exponer la funcionalidad de un control OLE, un punto de conexión implementa una interfaz saliente que puede iniciar acciones en otros objetos, como desencadenar eventos y notificaciones de cambio.

Una conexión consta de dos partes: el objeto que llama a la interfaz, denominado "origen" y el objeto que implementa la interfaz, denominado "receptor". Al exponer un punto de conexión, un origen permite a los receptores establecer conexiones a sí mismos. Mediante el mecanismo de punto de conexión, un objeto de origen obtiene un puntero 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.

De forma predeterminada, una clase derivada de COleControl implementa dos puntos de conexión: uno para eventos y otro para las notificaciones de cambio de propiedad. Estas conexiones se usan, respectivamente, para la activación de eventos y para notificar a un receptor (por ejemplo, el contenedor del control) cuando el valor de una propiedad ha cambiado. También se proporciona compatibilidad con los controles OLE para implementar puntos de conexión adicionales. Para cada punto de conexión adicional implementado en la clase de control, 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 conexiones" en la clase de control.

En el ejemplo siguiente se muestra un mapa de conexiones simple y un punto de conexión para el control OLE Sample, que consta de dos fragmentos de código: la primera parte declara el mapa de conexiones y el punto; la segunda implementa este mapa y punto. El primer fragmento se inserta en la declaración de la clase de control, en la sección 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 insertada, XSampleConnPt (derivada de CConnectionPoint), que implementa este punto de conexión determinado. Si quiere invalidar cualquier función miembro CConnectionPoint o agregar funciones miembro propias, declárelas entre estas dos macros. Por ejemplo, la macro CONNECTION_IID invalida la función miembro CConnectionPoint::GetIID cuando se coloca entre estas dos macros.

El segundo fragmento de código se inserta en el archivo de implementación (. CPP) de la clase de control. Este código implementa el mapa de conexiones, que incluye el punto de conexión adicional, SampleConnPt:

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

Una vez insertados estos fragmentos de código, el control OLE de ejemplo expone un punto de conexión para la interfaz ISampleSink.

Normalmente, los puntos de conexión admiten la "multidifusión", que es la capacidad de difundir a varios receptores conectados a la misma interfaz. En el siguiente fragmento de código se muestra cómo realizar la multidifusión mediante la iteración en cada receptor de 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 punto de conexión SampleConnPt con una llamada a CConnectionPoint::GetConnections. A continuación, itera por las conexiones y llama a ISampleSink::SinkFunc en cada conexión activa.

Para más información sobre cómo usar CConnectionPoint, consulte el artículo Puntos de conexión.

Jerarquía de herencia

CObject

CCmdTarget

CConnectionPoint

Requisitos

Encabezado: afxdisp.h

CConnectionPoint::CConnectionPoint

Construye un objeto CConnectionPoint.

CConnectionPoint();

CConnectionPoint::GetConnections

Llame a esta función para recuperar todas las conexiones activas de un punto de conexión.

const CPtrArray* GetConnections();

Valor devuelto

Puntero a una matriz de conexiones activas (receptores). Algunos de los punteros de la matriz pueden ser NULL. Cada puntero distinto de NULL de esta matriz se puede convertir de forma segura en un puntero a la interfaz receptora mediante un operador de conversión.

CConnectionPoint::GetContainer

Lo llama el marco para recuperar el IConnectionPointContainer para el punto de conexión.

virtual LPCONNECTIONPOINTCONTAINER GetContainer();

Valor devuelto

Puntero al contenedor si es correcto; de lo contrario, NULL.

Comentarios

Normalmente, esta función se implementa mediante la macro BEGIN_CONNECTION_PART.

CConnectionPoint::GetIID

Llamada por el marco para recuperar el id. de interfaz de un punto de conexión.

virtual REFIID GetIID() = 0;

Valor devuelto

Referencia al id. de interfaz del punto de conexión.

Comentarios

Invalide esta función para devolver el id. de interfaz de este punto de conexión.

CConnectionPoint::GetMaxConnections

Llamado por el marco para recuperar el número máximo de conexiones admitido por el punto de conexión.

virtual int GetMaxConnections();

Valor devuelto

Número máximo de conexiones admitidas por el control o -1 si no hay límite.

Comentarios

La implementación predeterminada devuelve -1, lo que indica que no hay límite.

Invalide esta función si desea limitar el número de receptores que se pueden conectar al control.

CConnectionPoint::GetNextConnection

Recupera un puntero al elemento de conexión en pos.

LPUNKNOWN GetNextConnection(POSITION& pos) const;

Parámetros

pos
Especifica una referencia a un valor POSITION devuelto por una llamada anterior GetNextConnection o GetStartPosition.

Valor devuelto

Puntero al elemento de conexión especificado por pos o NULL.

Comentarios

Esta función es más útil para recorrer en iteración todos los elementos del mapa de conexiones. Al iterar, omita los valores NULL devueltos por esta función.

Ejemplo

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 una iteración de mapa mediante la devolución de un valor POSITION que se puede pasar a una llamada GetNextConnection.

POSITION GetStartPosition() const;

Valor devuelto

Valor POSITION que indica una posición inicial para iterar la asignación; o NULL si la asignación está vacía.

Comentarios

La secuencia de iteración no es predecible; por lo tanto, el «primer elemento de la asignación» no tiene importancia especial.

Ejemplo

Vea el ejemplo de CConnectionPoint::GetNextConnection.

CConnectionPoint::OnAdvise

Lo llama el marco cuando se establece o interrumpe una conexión.

virtual void OnAdvise(BOOL bAdvise);

Parámetros

bAdvise
TRUE, si se está estableciendo una conexión; en caso contrario, FALSE.

Comentarios

La implementación predeterminada no hace nada.

Invalide esta función si desea recibir notificaciones cuando los receptores se conecten o se desconecten del punto de conexión.

CConnectionPoint::QuerySinkInterface

Recupera un puntero a la interfaz receptora solicitada.

virtual HRESULT QuerySinkInterface(
    LPUNKNOWN pUnkSink,
    void** ppInterface);

Parámetros

pUnkSink
Identificador de la interfaz de receptor solicitada.

ppInterface
Puntero al puntero de interfaz identificado por pUnkSink. Si el objeto no admite esta interfaz, * ppInterface se establece como NULL.

Valor devuelto

Valor HRESULT estándar.

Consulte también

CCmdTarget (clase)
Gráfico de jerarquías