Controlli ActiveX MFC: serializzazione

Questo articolo illustra come serializzare un controllo ActiveX. La serializzazione è il processo di lettura o scrittura in un supporto di archiviazione permanente, ad esempio un file su disco. La libreria MFC (Microsoft Foundation Class) fornisce il supporto predefinito per la serializzazione nella classe CObject. COleControl estende questo supporto ai controlli ActiveX tramite l'uso di un meccanismo di scambio di proprietà.

Importante

ActiveX è una tecnologia legacy che non deve essere usata per il nuovo sviluppo. Per altre informazioni sulle tecnologie moderne che sostituisce ActiveX, vedere Controlli ActiveX.

La serializzazione per i controlli ActiveX viene implementata eseguendo l'override di COleControl::D oPropExchange. Questa funzione, chiamata durante il caricamento e il salvataggio dell'oggetto di controllo, archivia tutte le proprietà implementate con una variabile membro o una variabile membro con notifica delle modifiche.

Gli argomenti seguenti illustrano i principali problemi relativi alla serializzazione di un controllo ActiveX:

Implementazione della funzione DoPropExchange

Quando si utilizza la Creazione guidata controllo ActiveX per generare il progetto di controllo, diverse funzioni del gestore predefinite vengono aggiunte automaticamente alla classe di controllo, inclusa l'implementazione predefinita di COleControl::D oPropExchange. L'esempio seguente mostra il codice aggiunto alle classi create con la Creazione guidata controllo ActiveX:

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

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

Se si desidera rendere persistente una proprietà, modificare DoPropExchange aggiungendo una chiamata alla funzione di scambio di proprietà. Nell'esempio seguente viene illustrata la serializzazione di una proprietà CircleShape booleana personalizzata, in cui la proprietà CircleShape ha un valore predefinito TRUE:

void CMyAxSerCtrl::DoPropExchange(CPropExchange* pPX)
{
   ExchangeVersion(pPX, MAKELONG(_wVerMinor, _wVerMajor));
   COleControl::DoPropExchange(pPX);
PX_Bool(pPX, _T("CircleShape"), m_bCircleShape, TRUE);
}

Nella tabella seguente sono elencate le possibili funzioni di scambio di proprietà che è possibile utilizzare per serializzare le proprietà del controllo:

Funzioni di scambio di proprietà Scopo
PX_Blob( ) Serializza una proprietà di dati BLOB (Binary Large Object).
PX_Bool( ) Serializza una proprietà booleana di tipo.
PX_Color( ) Serializza una proprietà di colore del tipo.
PX_Currency( ) Serializza una proprietà cy di tipo (valuta).
PX_Double( ) Serializza una proprietà di tipo double .
PX_Font( ) Serializza una proprietà Tipo di carattere.
PX_Float( ) Serializza una proprietà di tipo float .
PX_IUnknown( ) Serializza una proprietà di tipo LPUNKNOWN.
PX_Long( ) Serializza una proprietà di tipo long .
PX_Picture( ) Serializza una proprietà Picture di tipo.
PX_Short( ) Serializza una proprietà di tipo short .
PXstring( ) Serializza una proprietà di tipo CString .
PX_ULong( ) Serializza una proprietà ULONG di tipo.
PX_UShort( ) Serializza una proprietà di tipo USHORT .

Per altre informazioni su queste funzioni di scambio di proprietà, vedere Persistenza dei controlli OLE nella guida di riferimento MFC.

Personalizzazione del comportamento predefinito di DoPropExchange

L'implementazione predefinita di DoPropertyExchange (come illustrato nell'argomento precedente) esegue una chiamata alla classe COleControlbase . In questo modo il set di proprietà viene serializzato automaticamente supportato da COleControl, che utilizza più spazio di archiviazione rispetto alla serializzazione solo delle proprietà personalizzate del controllo. La rimozione di questa chiamata consente all'oggetto di serializzare solo le proprietà considerate importanti. Qualsiasi proprietà stock indica che il controllo è stato implementato non verrà serializzato durante il salvataggio o il caricamento dell'oggetto di controllo, a meno che non vengano aggiunte in modo esplicito PX_ chiamate.

Implementazione del supporto della versione

Il supporto della versione consente a un controllo ActiveX modificato di aggiungere nuove proprietà persistenti e di essere comunque in grado di rilevare e caricare lo stato persistente creato da una versione precedente del controllo. Per rendere disponibile la versione di un controllo come parte dei dati persistenti, chiamare COleControl::ExchangeVersion nella funzione del DoPropExchange controllo. Questa chiamata viene inserita automaticamente se il controllo ActiveX è stato creato tramite la Creazione guidata controllo ActiveX. Può essere rimosso se il supporto della versione non è necessario. Tuttavia, il costo delle dimensioni del controllo è molto piccolo (4 byte) per la maggiore flessibilità offerta dal supporto della versione.

Se il controllo non è stato creato con la Creazione guidata controllo ActiveX, aggiungere una chiamata a COleControl::ExchangeVersion inserendo la riga seguente all'inizio della funzione (prima della DoPropExchange chiamata a COleControl::DoPropExchange):

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

È possibile usare qualsiasi DWORD come numero di versione. I progetti generati dalla Creazione guidata controllo ActiveX usano _wVerMinor e _wVerMajor come impostazione predefinita. Si tratta di costanti globali definite nel file di implementazione della classe di controllo ActiveX del progetto. Nella parte restante DoPropExchange della funzione è possibile chiamare CPropExchange::GetVersion in qualsiasi momento per recuperare la versione che si sta salvando o recuperando.

Nell'esempio seguente, la versione 1 di questo controllo di esempio ha solo una proprietà "ReleaseDate". La versione 2 aggiunge una proprietà "OriginalDate". Se il controllo viene richiesto di caricare lo stato permanente dalla versione precedente, inizializza la variabile membro per la nuova proprietà su un valore predefinito.

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

Per impostazione predefinita, un controllo "converte" i dati precedenti nel formato più recente. Ad esempio, se la versione 2 di un controllo carica i dati salvati dalla versione 1, scriverà il formato della versione 2 quando viene salvato di nuovo. Se si desidera che il controllo salvi i dati nel formato dell'ultima lettura, passare FAL edizione Standard come terzo parametro quando si chiama ExchangeVersion. Questo terzo parametro è facoltativo ed è TRUE per impostazione predefinita.

Vedi anche

Controlli ActiveX MFC