Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Nota:
La biblioteca Microsoft Foundation Classes (MFC) sigue siendo compatible. Sin embargo, ya no estamos agregando características ni actualizando la documentación.
En este artículo se describe cómo serializar un control ActiveX. La serialización es el proceso de lectura o escritura en un medio de almacenamiento persistente, como un archivo de disco. La biblioteca Microsoft Foundation Class (MFC) proporciona compatibilidad integrada para la serialización en la clase CObject.
COleControl amplía esta compatibilidad con los controles ActiveX mediante el uso de un mecanismo de intercambio de propiedades.
Importante
ActiveX es una tecnología heredada que no se debe usar para el desarrollo nuevo. Para obtener más información sobre las tecnologías modernas que sustituyen a ActiveX, consulte Controles ActiveX.
La serialización de controles ActiveX se implementa sobrescribiendo COleControl::DoPropExchange. Esta función, que se invoca durante la carga y el guardado del objeto de control, almacena todas las propiedades implementadas con una variable de miembro o una variable de miembro con notificación de cambio.
En los temas siguientes se tratan los principales problemas relacionados con la serialización de un control ActiveX:
Implementar la función
DoPropExchangepara serializar su objeto de control
Implementación de la función DoPropExchange
Cuando se usa el Asistente para controles ActiveX para generar el proyecto de control, se agregan automáticamente varias funciones de controlador predeterminadas a la clase de control, incluida la implementación predeterminada de COleControl::D oPropExchange. En el ejemplo siguiente se muestra el código agregado a las clases creadas con el Asistente para controles ActiveX:
void CMyAxUICtrl::DoPropExchange(CPropExchange* pPX)
{
ExchangeVersion(pPX, MAKELONG(_wVerMinor, _wVerMajor));
COleControl::DoPropExchange(pPX);
// TODO: Call PX_ functions for each persistent custom property.
}
Si desea que una propiedad sea persistente, modifique DoPropExchange agregando una llamada a la función de intercambio de propiedades. En el ejemplo siguiente se muestra la serialización de una propiedad Boolean CircleShape personalizada, donde la propiedad CircleShape tiene un valor predeterminado de TRUE:
void CMyAxSerCtrl::DoPropExchange(CPropExchange* pPX)
{
ExchangeVersion(pPX, MAKELONG(_wVerMinor, _wVerMajor));
COleControl::DoPropExchange(pPX);
PX_Bool(pPX, _T("CircleShape"), m_bCircleShape, TRUE);
}
En la tabla siguiente se enumeran las posibles funciones de intercambio de propiedades que puede usar para serializar las propiedades del control:
| Funciones de intercambio de propiedades | Propósito |
|---|---|
| PX_Blob( ) | Serializa una propiedad de datos de tipo Binary Large Object (BLOB). |
| PX_Bool( ) | Serializa una propiedad del tipo Booleano. |
| PX_Color( ) | Serializa una propiedad de color de tipo. |
| PX_Currency( ) | Serializa una propiedad de tipo CY (moneda). |
| PX_Double( ) | Serializa una propiedad de tipo double . |
| PX_Font( ) | Serializa una propiedad de tipo de fuente. |
| PX_Float( ) | Serializa una propiedad de tipo float . |
| PX_IUnknown( ) | Serializa una propiedad de tipo LPUNKNOWN. |
| PX_Long( ) | Serializa una propiedad de tipo long . |
| PX_Picture( ) | Serializa una propiedad Picture de tipo. |
| PX_Short( ) | Serializa una propiedad de tipo short . |
| PXstring( ) | Serializa una propiedad de tipo CString . |
| PX_ULong( ) | Serializa una propiedad de tipo ULONG. |
| PX_UShort( ) | Serializa una propiedad tipo USHORT. |
Para obtener más información sobre estas funciones de intercambio de propiedades, vea Persistencia de controles OLE en la referencia de MFC.
Personalización del comportamiento predeterminado de DoPropExchange
La implementación predeterminada de DoPropertyExchange (como se muestra en el tema anterior) realiza una llamada a la clase COleControlbase . Esto serializa el conjunto de propiedades que COleControl admite automáticamente, lo cual utiliza más espacio de almacenamiento que serializar solo las propiedades personalizadas del control. Al quitar esta llamada, el objeto solo puede serializar esas propiedades que considere importantes. Cualquier propiedad stock que el control haya implementado no se serializará al guardar o cargar el objeto de control, a menos que agregue explícitamente llamadas PX_ para dichas propiedades.
Implementación de la compatibilidad con versiones
La compatibilidad con versiones permite que un control ActiveX revisado agregue nuevas propiedades persistentes y pueda detectar y cargar el estado persistente creado por una versión anterior del control. Para que la versión de un control esté disponible como parte de sus datos persistentes, llame a COleControl::ExchangeVersion en la función correspondiente del control DoPropExchange. Esta llamada se inserta automáticamente si el control ActiveX se creó mediante el Asistente para controles ActiveX. Se puede quitar si no se necesita compatibilidad con versiones. Sin embargo, el tamaño del control del costo es muy pequeño (4 bytes) para la flexibilidad adicional que proporciona la compatibilidad con versiones.
Si el control no se creó con el Asistente para controles ActiveX, agregue una llamada a COleControl::ExchangeVersion insertando la siguiente línea al principio de la función (antes de DoPropExchange llamar a COleControl::DoPropExchange):
void CMyAxSerCtrl::DoPropExchange(CPropExchange* pPX)
{
ExchangeVersion(pPX, MAKELONG(_wVerMinor, _wVerMajor));
COleControl::DoPropExchange(pPX);
}
Puede usar cualquier DWORD como número de versión. Los proyectos generados por el Asistente para controles ActiveX usan _wVerMinor y _wVerMajor como valor predeterminado. Se trata de constantes globales definidas en el archivo de implementación de la clase de control ActiveX del proyecto. En el resto de la función DoPropExchange, puede llamar a CPropExchange::GetVersion en cualquier momento para recuperar la versión que está guardando o recuperando.
En el ejemplo siguiente, la versión 1 de este control de ejemplo solo tiene una propiedad "ReleaseDate". La versión 2 agrega una propiedad "OriginalDate". Si se indica al control que cargue el estado persistente desde la versión anterior, inicializa la variable miembro de la nueva propiedad en un valor predeterminado.
void CMyAxSerCtrl::DoPropExchange(CPropExchange* pPX)
{
ExchangeVersion(pPX, MAKELONG(_wVerMinor, _wVerMajor));
COleControl::DoPropExchange(pPX);
PX_Long(pPX, _T("ReleaseDate"), m_ReleaseDate);
if (pPX->GetVersion() >= MAKELONG(0, 2))
{
PX_Long(pPX, _T("OriginalDate"), m_OriginalDate);
}
else
{
if (pPX->IsLoading())
m_OriginalDate = 0;
}
}
De forma predeterminada, un control "convierte" datos antiguos en el formato más reciente. Por ejemplo, si la versión 2 de un control carga los datos guardados por la versión 1, escribirá el formato de la versión 2 cuando se vuelva a guardar. Si desea que el control guarde los datos en el formato de última lectura, pase FALSE como tercer parámetro al llamar a ExchangeVersion. Este tercer parámetro es opcional y es TRUE de forma predeterminada.