Controles ActiveX MFC: Serializar
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 nuevo desarrollo. Para más información sobre las tecnologías modernas que reemplazan a ActiveX, vea Controles ActiveX.
La serialización de controles ActiveX se implementa invalidando COleControl::D oPropExchange. Esta función, denominada durante la carga y el guardado del objeto de control, almacena todas las propiedades implementadas con una variable miembro o una variable miembro con notificación de cambio.
En los temas siguientes se tratan los principales problemas relacionados con la serialización de un control ActiveX:
Implementación de la función
DoPropExchange
para serializar el 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::DoPropExchange. 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 objeto binario grande (BLOB). |
PX_Bool( ) | Serializa una propiedad booleana de tipo. |
PX_Color( ) | Serializa una propiedad de color de tipo. |
PX_Currency( ) | Serializa una propiedad CY de tipo (moneda). |
PX_Double( ) | Serializa una propiedad double de tipo. |
PX_Font( ) | Serializa una propiedad de tipo de fuente. |
PX_Float( ) | Serializa una propiedad float de tipo. |
PX_IUnknown( ) | Serializa una propiedad LPUNKNOWN de tipo. |
PX_Long( ) | Serializa una propiedad long de tipo. |
PX_Picture( ) | Serializa una propiedad Picture de tipo. |
PX_Short( ) | Serializa una propiedad short de tipo. |
PXstring( ) | Serializa una propiedad CString de tipo. |
PX_ULong( ) | Serializa una propiedad ULONG de tipo. |
PX_UShort( ) | Serializa una propiedad USHORT de tipo. |
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 base COleControl
. Esto serializa el conjunto de propiedades admitido automáticamente por COleControl
, que usa 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. Los estados de propiedad stock que haya implementado el control no se serializarán al guardar o cargar el objeto de control a menos que agregue explícitamente PX_ para que los llame.
Implementación de 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 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 DoPropExchange
(antes de la llamada 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 para 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" los datos antiguos al 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.