Partager via


Contrôles ActiveX MFC : Sérialisation

Cet article explique comment sérialiser un contrôle ActiveX.La sérialisation est le processus de la lecture ou d'écriture dans un support de stockage persistant, tel qu'un fichier sur disque.La bibliothèque (MFC) MFC fournit la prise en charge intégrée de la sérialisation dans la classe CObject.COleControl étend cette prise en charge des contrôles ActiveX à l'aide d'un mécanisme d'échange de propriétés.

La sérialisation des contrôles ActiveX est implémentée en substituant COleControl::DoPropExchange.Ces fonction, appelées pendant le chargement et l'enregistrement de l'objet contrôle, stocke que toutes les propriétés sont implémentées avec une variable membre ou une variable membre avec la notification de modifications.

Les rubriques suivantes décrivent les principaux problèmes liés à sérialiser un contrôle ActiveX :

  • En implémentant DoPropExchangefonction pour sérialiser votre objet de contrôle

  • Personnaliser le processus de sérialisation

  • Implémenter la prise en charge des versions

Implémenter la fonction de DoPropExchange

Lorsque vous utilisez l'Assistant Contrôle ActiveX pour générer le projet de contrôle, plusieurs fonctions gestionnaires par défaut sont automatiquement ajoutées à la classe du contrôle, l'implémentation par défaut de COleControl::DoPropExchange.L'exemple suivant affiche le code ajouté aux classes créées avec l'Assistant Contrôle ActiveX :

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

   // TODO: Call PX_ functions for each persistent custom property.
}

Si vous souhaitez rendre une propriété persistante, modifiez DoPropExchange en ajoutant un appel à la fonction d'échange de propriétés.L'exemple suivant illustre la sérialisation d'une propriété booléenne personnalisée de CircleShape, où la propriété de CircleShape a une valeur par défaut de TRUE:

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


...


   PX_Bool(pPX, _T("CircleShape"), m_bCircleShape, TRUE);
}

Le tableau suivant répertorie les fonctions possibles d'échange de propriétés que vous pouvez utiliser pour sérialiser les propriétés du contrôle :

Fonctions d'échange de propriétés

Objectif

PX_Blob ()

Sérialise une propriété des données d'objet blob (BLOB) de type.

PX_Bool ()

Sérialise une propriété booléenne de type.

PX_Color ()

Sérialise une propriété de couleur de type.

PX_Currency ()

Sérialise une propriété de CY de type (monétaire).

PX_Double ()

Sérialise une propriété de double de type.

PX_Font ()

Sérialise une propriété de type de police.

PX_Float ()

Sérialise une propriété de float de type.

PX_IUnknown ()

Sérialise une propriété de type LPUNKNOWN.

PX_Long ()

Sérialise une propriété de long de type.

PX_Picture ()

Sérialise une propriété d'image de type.

PX_Short ()

Sérialise une propriété de short de type.

PX_String ()

Sérialise une propriété d' CString de type.

PX_ULong ()

Sérialise une propriété d' ULONG de type.

PX_UShort ()

Sérialise une propriété d' USHORT de type.

Pour plus d'informations sur ces fonctions d'échange de propriétés, consultez persistance des contrôles OLE dans MFC Reference.

Personnaliser le comportement par défaut de DoPropExchange

L'implémentation par défaut de DoPropertyExchange (comme indiqué dans la rubrique précédente) effectue un appel à la classe de base COleControl.Cela sérialise l'ensemble de propriétés automatiquement prises en charge par COleControl, qui utilise davantage d'espace de stockage que sérialisant uniquement les propriétés personnalisées du contrôle.Supprimer cet appel permet à votre objet pour sérialiser uniquement les propriétés que vous considérez important.Propriété boursières en indique que le contrôle a implémenté ne sera pas sérialisé en enregistrant ou en chargeant l'objet contrôle à moins que vous avez ajouté explicitement des appels de PX_ pour eux.

Implémenter la prise en charge des versions

La prise en charge des versions permet à un contrôle ActiveX modifié pour ajouter de nouvelles propriétés persistantes, et puisse toujours détecter et de charger l'état de persistance créé dans une version antérieure du contrôle.Pour rendre la version d'un contrôle disponible dans le cadre de ses données persistantes, appelez COleControl::ExchangeVersion dans la fonction d' DoPropExchange du contrôle.Cet appel est inséré automatiquement si le contrôle ActiveX a été créé à l'aide de l'Assistant Contrôle ActiveX.Il peut être supprimé si la prise en charge des versions n'est pas nécessaire.Toutefois, le coût de la taille de contrôle est très court (4 octets) pour une flexibilité supplémentaire de la prise en charge des versions fournit.

Si le contrôle n'a pas été créé avec l'Assistant Contrôle ActiveX, ajoutez un appel à COleControl::ExchangeVersion en insérant la ligne suivante au début de votre fonction d' DoPropExchange (avant l'appel à COleControl::DoPropExchange) :

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


...


}

Vous pouvez utiliser tout DWORD comme numéro de version.Projets générés par l'utilisation _wVerMinor et _wVerMajor de l'Assistant Contrôle ActiveX comme valeur par défaut.Ce sont des constantes globales définies dans le fichier d'implémentation de classe du contrôle ActiveX du projet.Dans le reste de la fonction d' DoPropExchange , vous pouvez appeler CPropExchange::GetVersion à tout moment pour extraire la version que vous enregistrez ou récupérez.

Dans l'exemple suivant, la version 1 de ce contrôle dispose d'une seule propriété « ReleaseDate ».La version 2 ajoute une propriété « OriginalDate ».Si le contrôle est chargé de charger l'état de persistance de l'ancienne version, il initialise la variable membre pour la nouvelle propriété une valeur par défaut.

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;
   }


...


}

Par défaut, un contrôle « convertit » les anciennes données au dernier format.Par exemple, si la version 2 d'un contrôle charge les données qui ont été signalée par la version 1, elle écrit le format de la version 2 lorsqu'il est stocké de nouveau.Si vous souhaitez un contrôle pour enregistrer des données dans la lecture de bout de format, passez FALSE comme troisième paramètre en appelant ExchangeVersion.Ce troisième paramètre est facultatif et se TRUE par défaut.

Voir aussi

Concepts

Contrôles ActiveX MFC