Puntos de conexión
En este artículo se explica cómo implementar puntos de conexión (anteriormente conocido como puntos de conexión de OLE) mediante las clases MFC CCmdTarget y CConnectionPoint.
En el pasado, el (COM) modelo de objetos componentes definido un mecanismo general (IUnknown::QueryInterface) que permitía que los objetos se y que expusieran funcionalidad en interfaces.Sin embargo, un mecanismo correspondiente que le permita a los objetos expusieran su capacidad de llamar a interfaces específicas no está definido.Es decir, definido COM cómo los punteros de entrada a los objetos (punteros a las interfaces de ese objeto) se controlaron, pero no tenía un modelo explícito para las interfaces de salida (punteros el objeto contienen a otros objetos interfaces).COM tiene ahora un modelo, denominado puntos de conexión, que admite esta funcionalidad.
Una conexión tiene dos partes: el objeto que llama a la interfaz, denominada el origen, y el objeto que implementa la interfaz, denominada receptor.Un punto de conexión es la interfaz que expone el origen.Expone un punto de conexión, un origen permite que los receptores establecen conexiones a sí mismo (el origen).A través del mecanismo de puntos de conexión (la interfaz de IConnectionPoint ), un puntero a la interfaz de receptor se pasa al objeto de origen.Este puntero proporciona el origen con acceso a la implementación de receptor de un conjunto de funciones miembro.Por ejemplo, para desencadenar un evento implementado por el receptor, el origen puede llamar al método correspondiente de la implementación de receptor.La ilustración siguiente se muestra el punto de conexión descrito.
Un punto de conexión implementado
MFC implementa este modelo en las clases de CConnectionPoint y de CCmdTarget .Las clases derivadas de CConnectionPoint implementan la interfaz de IConnectionPoint , utilizada para exponer los puntos de conexión a otros objetos.Las clases derivadas de CCmdTarget implementan la interfaz de IConnectionPointContainer , que puede enumerar todos los puntos de conexión disponible de un objeto o encuentra un punto de conexión concreto.
Para cada punto de conexión implementado en la clase, debe declarar una parte de la conexión que implementa el punto de conexión.Si implementa uno o varios puntos de conexión, también debe declarar una sola conexión asignada en su clase.Un mapa de conexión es una tabla de puntos de conexión admitidos por el control ActiveX.
Los ejemplos siguientes muestran un mapa simple de conexión y un punto de conexión.El primer ejemplo declara el mapa y el punto de conexión; el segundo ejemplo implementa el mapa y elija.Observe que CMyClassdebe ser CCmdTarget- clase derivada.En el primer ejemplo, el código se inserta en la declaración de clase, en la sección protected:
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()
BEGIN_CONNECTION_PART y macros de END_CONNECTION_PART declare una clase incrustada, XSampleConnPt (derivado de CConnectionPoint), que implementa este punto de conexión determinado.Si desea reemplazar cualquier funciones miembro de CConnectionPoint o para agregar funciones miembro propio, declárelos entre estas dos macros.Por ejemplo, la macro de CONNECTION_IID reemplaza la función miembro de CConnectionPoint::GetIID cuando está colocada entre estas dos macros.
En el segundo ejemplo, se inserta código en el archivo de implementación del control (archivo .cpp).Este código implementa la asignación de la 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 las macros adicionales de CONNECTION_PART entre BEGIN_CONNECTION_MAP y macros de END_CONNECTION_MAP .
Finalmente, agregue una llamada a EnableConnections en el constructor de clase.Por ejemplo:
CMyClass::CMyClass()
{
EnableConnections();
}
Una vez que se ha insertado este código, su CCmdTarget- clase derivada expone un punto de conexión para la interfaz de ISampleSink .La ilustración siguiente se muestra este ejemplo.
Un punto de Conexión implementado con MFC
Normalmente, los puntos de conexión admiten la “conoce como multidifusión” — la capacidad de propagar a varios receptores conectados a la misma interfaz.El siguiente fragmento de ejemplo ilustra la forma de multidifusión recorriendo en iteración 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();
}
}
Este ejemplo recupera el conjunto actual de conexiones en el punto de conexión de SampleConnPt con una llamada a CConnectionPoint::GetConnections.Después recorre en iteración las conexiones y llama a ISampleSink::SinkFunc en cada conexión activa.