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.
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 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
DoPropExchangela función 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::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 Binary Large Object (BLOB) de tipo. |
| 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 de tipo double . |
| PX_Font( ) | Serializa una propiedad font type. |
| 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 ULONG de tipo. |
| PX_UShort( ) | Serializa una propiedad de 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 admite COleControlautomáticamente , 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. Cualquier propiedad stock indica que el control se ha implementado no se serializará al guardar o cargar el objeto de control a menos que agregue explícitamente PX_ llamadas para ellos.
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 del DoPropExchange control. 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 costo en el tamaño del control 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 DoPropExchange función, 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.