Mapas de conexiones
Los controles OLE pueden exponer interfaces a otras aplicaciones. Estas interfaces solo permiten el acceso desde un contenedor a ese control. Si un control OLE desea tener acceso a interfaces externas de otros objetos OLE, se debe establecer un punto de conexión. Este punto de conexión permite un control de acceso saliente a mapas de distribución externos, como mapas de eventos o funciones de notificación.
La biblioteca Microsoft Foundation Class ofrece un modelo de programación que admite puntos de conexión. En este modelo, se usan "mapas de conexión" para designar interfaces o puntos de conexión para el control OLE. Los mapas de conexión contienen una macro para cada punto de conexión. Para obtener más información sobre los mapas de conexión, consulte la CConnectionPoint
clase .
Normalmente, un control admite solo dos puntos de conexión: uno para eventos y otro para las notificaciones de propiedades. Estas se implementan mediante la COleControl
clase base y no requieren ningún trabajo adicional por parte del escritor de controles. Cualquier otro punto de conexión que quiera implementar en la clase debe agregarse manualmente. Para admitir mapas y puntos de conexión, MFC proporciona las macros siguientes:
Declaración y demarcación de mapa de conexión
Nombre | Descripción |
---|---|
BEGIN_CONNECTION_PART |
Declara una clase incrustada que implementa un punto de conexión adicional (se debe usar en la declaración de clase). |
END_CONNECTION_PART |
Finaliza la declaración de un punto de conexión (se debe usar en la declaración de clase). |
CONNECTION_IID |
Especifica el identificador de interfaz del punto de conexión del control. |
DECLARE_CONNECTION_MAP |
Declara que se usará un mapa de conexión en una clase (se debe usar en la declaración de clase). |
BEGIN_CONNECTION_MAP |
Comienza la definición de un mapa de conexión (debe usarse en la implementación de la clase). |
END_CONNECTION_MAP |
Finaliza la definición de un mapa de conexión (debe usarse en la implementación de la clase). |
CONNECTION_PART |
Especifica un punto de conexión en el mapa de conexión del control. |
Las siguientes funciones ayudan a un receptor a establecer y desconectar una conexión mediante puntos de conexión:
Inicialización y finalización de puntos de conexión
Nombre | Descripción |
---|---|
AfxConnectionAdvise |
Establece una conexión entre un origen y un receptor. |
AfxConnectionUnadvise |
Interrumpe una conexión entre un origen y un receptor. |
BEGIN_CONNECTION_PART
Use la BEGIN_CONNECTION_PART
macro para comenzar la definición de puntos de conexión adicionales más allá de los puntos de conexión de notificación de eventos y propiedades.
BEGIN_CONNECTION_PART(theClass, localClass)
Parámetros
theClass
Especifica el nombre de la clase de control cuyo punto de conexión es este.
localClass
Especifica el nombre de la clase local que implementa el punto de conexión.
Comentarios
En el archivo de declaración (.h
) que define las funciones miembro de la clase, inicie el punto de conexión con la BEGIN_CONNECTION_PART
macro. A continuación, agregue la CONNECTION_IID
macro y cualquier otra función miembro que desee implementar. Por último, complete el mapa del punto de conexión con la END_CONNECTION_PART
macro.
Requisitos
Encabezado afxdisp.h
END_CONNECTION_PART
Finaliza la declaración del punto de conexión.
END_CONNECTION_PART(localClass)
Parámetros
localClass
Especifica el nombre de la clase local que implementa el punto de conexión.
Requisitos
Encabezado afxdisp.h
CONNECTION_IID
Use entre las BEGIN_CONNECTION_PART
macros y END_CONNECTION_PART
para definir un identificador de interfaz para un punto de conexión compatible con el control OLE.
CONNECTION_IID(iid)
Parámetros
iid
Identificador de interfaz de la interfaz a la que llama el punto de conexión.
Comentarios
El iid
argumento es un identificador de interfaz que se usa para identificar la interfaz a la que llama el punto de conexión en sus receptores conectados. Por ejemplo:
CONNECTION_IID(IID_ISampleSink)
Especifica un punto de conexión que llama a la ISinkInterface
interfaz.
Requisitos
Encabezado afxdisp.h
DECLARE_CONNECTION_MAP
Cada clase derivada de COleControl
en el programa puede proporcionar un mapa de conexión para especificar puntos de conexión adicionales que admita el control.
DECLARE_CONNECTION_MAP()
Comentarios
Si el control admite puntos adicionales, use la DECLARE_CONNECTION_MAP
macro al final de la declaración de clase. A continuación, en el archivo .cpp que define las funciones miembro de la clase , use la BEGIN_CONNECTION_MAP
macro, CONNECTION_PART
las macros para cada uno de los puntos de conexión del control y la END_CONNECTION_MAP
macro para declarar el final del mapa de conexión.
Requisitos
Encabezado afxdisp.h
BEGIN_CONNECTION_MAP
Cada clase derivada de COleControl
en el programa puede proporcionar un mapa de conexión para especificar puntos de conexión que admitirá el control.
BEGIN_CONNECTION_MAP(theClass, theBase)
Parámetros
theClass
Especifica el nombre de la clase de control cuyo punto de conexión es este.
theBase
Especifica el nombre de clase base de theClass
.
Comentarios
En el archivo de implementación (.CPP
) que define las funciones miembro de la clase, inicie el mapa de conexión con la BEGIN_CONNECTION_MAP
macro y agregue entradas de macro para cada uno de los puntos de conexión mediante la CONNECTION_PART
macro. Por último, complete el mapa de conexión con la END_CONNECTION_MAP
macro.
Requisitos
Encabezado afxdisp.h
END_CONNECTION_MAP
Finaliza la definición del mapa de conexión.
END_CONNECTION_MAP()
Requisitos
Encabezado afxdisp.h
CONNECTION_PART
Asigna un punto de conexión para el control OLE a un identificador de interfaz específico.
CONNECTION_PART(theClass, iid, localClass)
Parámetros
theClass
Especifica el nombre de la clase de control cuyo punto de conexión es este.
iid
Identificador de interfaz de la interfaz a la que llama el punto de conexión.
localClass
Especifica el nombre de la clase local que implementa el punto de conexión.
Comentarios
Por ejemplo:
BEGIN_CONNECTION_MAP(CMyClass, CCmdTarget)
CONNECTION_PART(CMyClass, IID_ISampleSink, SampleConnPt)
END_CONNECTION_MAP()
implementa un mapa de conexión, con un punto de conexión, que llama a la interfaz IID_ISinkInterface
.
Requisitos
Encabezado afxdisp.h
AfxConnectionAdvise
Llame a esta función para establecer una conexión entre un origen, especificado por pUnkSrc
y un receptor, especificado por pUnkSink
.
BOOL AFXAPI AfxConnectionAdvise(
LPUNKNOWN pUnkSrc,
REFIID iid,
LPUNKNOWN pUnkSink,
BOOL bRefCount,
DWORD FAR* pdwCookie);
Parámetros
pUnkSrc
Puntero al objeto que llama a la interfaz.
pUnkSink
Puntero al objeto que implementa la interfaz.
iid
Identificador de la interfaz de la conexión.
bRefCount
Para las conexiones fuera de proceso, este parámetro debe ser TRUE
y indica que la creación de la conexión debe hacer que se incremente el recuento de referencias de pUnkSink
.
En el caso de las conexiones en proceso, TRUE
indica que la creación de la conexión debe hacer que se incremente el recuento de pUnkSink
referencias. FALSE
indica que no se debe incrementar el recuento de referencias.
Advertencia: En general, no se puede predecir qué conexiones están en proceso y qué conexiones están fuera de proceso, por lo que se recomienda establecer siempre este parámetro TRUE
en .
pdwCookie
Puntero a un DWORD
donde se devuelve un identificador de conexión. Este valor debe pasarse como parámetro dwCookie
a AfxConnectionUnadvise
al desconectar la conexión.
Valor devuelto
Distinto de cero si se estableció una conexión; de lo contrario, 0.
Ejemplo
//CMySink is a CCmdTarget-derived class supporting automation.
//Instantiate the sink class.
CMySink mysink;
//Get a pointer to sink's IUnknown, no AddRef done.
IID iid = IID_IUnknown;
IUnknown* pUnkSink = mysink.GetInterface(&iid);
//Establish a connection between source and sink.
//pUnkSrc is IUnknown of server obtained by CoCreateInstance().
//dwCookie is a cookie identifying the connection, and is needed
//to terminate this connection.
AfxConnectionAdvise(pUnkSrc, IID_ISampleSink, pUnkSink, FALSE, &dwCookie);
Requisitos
Encabezado: afxctl.h
AfxConnectionUnadvise
Llame a esta función para desconectar una conexión entre un origen, especificado por pUnkSrc
y un receptor, especificado por pUnkSink
.
BOOL AFXAPI AfxConnectionUnadvise(
LPUNKNOWN pUnkSrc,
REFIID iid,
LPUNKNOWN pUnkSink,
BOOL bRefCount,
DWORD dwCookie);
Parámetros
pUnkSrc
Puntero al objeto que llama a la interfaz.
pUnkSink
Puntero al objeto que implementa la interfaz.
iid
Identificador de interfaz de la interfaz del punto de conexión.
bRefCount
En el caso de las conexiones fuera del proceso, este parámetro debe ser TRUE
y indica que la creación de la conexión debe hacer que se decremente el recuento de referencias de pUnkSink
.
En el caso de las conexiones en proceso, TRUE
indica que la creación de la conexión debe provocar que se decremente el recuento de pUnkSink
referencias. FALSE
indica que no se debe disminuir el recuento de referencias.
Advertencia: En general, no se puede predecir qué conexiones están en proceso y qué conexiones están fuera de proceso, por lo que se recomienda establecer siempre este parámetro TRUE
en .
dwCookie
Identificador de conexión devuelto por AfxConnectionAdvise
.
Valor devuelto
Distinto de cero si se desconecta una conexión; de lo contrario, 0.
Ejemplo
//mysink is a CCmdTarget-derived class supporting automation.
//Get a pointer to sink's IUnknown, no AddRef done.
IID iid = IID_IUnknown;
IUnknown* pUnkSink = mysink.GetInterface(&iid);
//Terminate a connection between source and sink.
//pUnkSrc is IUnknown of server obtained by CoCreateInstance().
//dwCookie is a value obtained through AfxConnectionAdvise().
AfxConnectionUnadvise(pUnkSrc, IID_ISampleSink, pUnkSink, FALSE, dwCookie);
Requisitos
Encabezado: afxctl.h