Compartir a través de


Controles ActiveX de MFC: Serializar

En este artículo se explica cómo serializar un control ActiveX.La serialización es el proceso de lectura de o de la escritura en un medio de almacenamiento persistente, como un archivo de disco.La biblioteca (MFC) Microsoft Foundation Class proporciona compatibilidad integrada para la serialización en la clase CObject.COleControl extiende esta compatibilidad a controles ActiveX mediante el uso de un mecanismo de intercambio de propiedad.

La serialización de los controles ActiveX se implementa invalidando COleControl::DoPropExchange.Esta función, denominada durante la carga y el guardado de objeto del control, almacena todas las propiedades implementadas con una variable miembro o una variable miembro con la notificación.

Los temas siguientes se tratan los puntos principales relacionados con la serialización de un control ActiveX:

  • Implementar DoPropExchangefuncione para serializar el objeto de control

  • Personalizar el proceso de serialización

  • Implementar el control de versiones

Implementar la función de DoPropExchange

Cuando se utiliza el asistente para controles ActiveX para generar el proyecto de control, varias funciones predeterminadas de controlador se agregan automáticamente a la clase de control, incluida la implementación predeterminada de COleControl::DoPropExchange.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 crear una propiedad persistente, modifique DoPropExchange agregando una llamada a la función de intercambio de propiedad.El ejemplo siguiente se muestra la serialización de una propiedad booleana personalizada de CircleShape, donde la propiedad de 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);
}

La tabla siguiente se enumeran las funciones posibles de intercambio de propiedad que se puede utilizar para serializar las propiedades del control:

Funciones de intercambio de propiedad

Propósito

PX_Blob ()

Serializa una propiedad de los datos (BLOB) de objeto binario grande de tipo.

PX_Bool ()

Serializa una propiedad boolean de tipo.

PX_Color ()

Serializa una propiedad color del tipo.

PX_Currency ()

Serializa una propiedad de CY de tipo (moneda).

PX_Double ()

Serializa una propiedad de double de tipo.

PX_Font ()

Serializa una propiedad de tipo de fuente.

PX_Float ()

Serializa una propiedad de float de tipo.

PX_IUnknown ()

Serializa una propiedad de LPUNKNOWNescrito.

PX_Long ()

Serializa una propiedad de long de tipo.

PX_Picture ()

Serializa una propiedad de imagen del tipo.

PX_Short ()

Serializa una propiedad de short de tipo.

PX_String ()

Serializa una propiedad de CString de tipo.

PX_ULong ()

Serializan una propiedad de ULONG de tipo.

PX_UShort ()

Serializan una propiedad de USHORT de tipo.

Para obtener más información sobre estas funciones de intercambio de propiedad, vea persistencia de controles OLE en la referencia de MFC.

Personalizar el 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 automáticamente admitidas por COleControl, que utiliza más espacio de almacenamiento que serializar solo las propiedades personalizadas del control.Quitar esta llamada permite que el objeto serialice solo las propiedades que se considera importante.Cualquier propiedad común indica el control ha implementado no será serializado al guardar o cargar el objeto de control a menos que se le agrega explícitamente las llamadas de PX_ para ellos.

Implementar el control de versiones

Compatibilidad de versiones permite a un control ActiveX revisado para agregar nuevas propiedades persistentes y, aún puede detectar y cargar el estado persistente creada por una versión anterior del control.Para crear la versión de un control disponibles como parte de los datos persistentes, llame a COleControl::ExchangeVersion en función de DoPropExchange del control.Esta llamada se insertará automáticamente si el control ActiveX se creó mediante el asistente para controles ActiveX.Puede quitarse si la compatibilidad de versiones no es necesario.Sin embargo, el costo de tamaño del control es muy pequeño (4 bytes) para la flexibilidad adicional de la compatibilidad con versión proporciona.

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 del rol de DoPropExchange (antes de la llamada a COleControl::DoPropExchange):

void CMyAxSerCtrl::DoPropExchange(CPropExchange* pPX)
{
    ExchangeVersion(pPX, MAKELONG(_wVerMinor, _wVerMajor));
    COleControl::DoPropExchange(pPX);


...


}

Puede utilizar cualquier DWORD como el número de versión.Proyectos generados por el uso _wVerMinor y _wVerMajor del asistente para controles ActiveX como valor predeterminado.Éstas son constantes globales definido en el archivo de implementación de la clase de control ActiveX del proyecto.En el resto de la función de DoPropExchange , puede llamar a CPropExchange::GetVersion en cualquier momento para recuperar la versión que va a guardar o que está recuperando.

En el ejemplo siguiente, la versión 1 de este control de ejemplo sólo tiene una propiedad de “ReleaseDate”.La versión 2 agrega una propiedad “OriginalDate”.Si el control se indica para cargar el estado persistente de la versión anterior, se 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” datos anterior al último formato.Por ejemplo, si la versión 2 de un control carga los datos que se guardó por la versión 1, escribirá el formato de la versión 2 cuando se guarda de nuevo.Si desea que el control para guardar datos en la lectura del último de formato, pase FALSE como tercer parámetro al llamar a ExchangeVersion.Este tercer parámetro es opcional y es TRUE de forma predeterminada.

Vea también

Conceptos

Controles ActiveX de MFC