Dela via


MFC ActiveX-kontroller: Serialisering

I den här artikeln beskrivs hur du serialiserar en ActiveX-kontroll. Serialisering är processen att läsa från eller skriva till ett beständigt lagringsmedium, till exempel en diskfil. MFC-biblioteket (Microsoft Foundation Class) har inbyggt stöd för serialisering i klassen CObject. COleControl utökar det här stödet till ActiveX-kontroller med hjälp av en egenskapsutbytesmekanism.

Viktigt!

ActiveX är en äldre teknik som inte bör användas för ny utveckling. Mer information om moderna tekniker som ersätter ActiveX finns i ActiveX-kontroller.

Serialisering för ActiveX-kontroller implementeras genom att åsidosätta metoden COleControl::DoPropExchange. Den här funktionen, som anropas när kontrollobjektet läses in och sparas, lagrar alla egenskaper som implementerats med en medlemsvariabel eller en medlemsvariabel med ändringsmeddelande.

Följande avsnitt beskriver de viktigaste problemen med serialisering av en ActiveX-kontroll:

Implementera DoPropExchange-funktionen

När du använder guiden ActiveX-kontroll för att generera kontrollprojektet läggs flera standardhanterarfunktioner automatiskt till i kontrollklassen, inklusive standardimplementeringen av COleControl::D oPropExchange. I följande exempel visas koden som lagts till i klasser som skapats med ActiveX-kontrollguiden:

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

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

Om du vill göra en egenskap beständig ändrar du DoPropExchange genom att lägga till ett anrop till egenskapsutbytesfunktionen. I följande exempel visas serialiseringen av en anpassad boolesk CircleShape-egenskap, där egenskapen CircleShape har standardvärdet TRUE:

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

I följande tabell visas de möjliga egenskapsutbytesfunktioner som du kan använda för att serialisera kontrollens egenskaper:

Egenskapsutbytesfunktioner Avsikt
PX_Blob( ) Serialiserar en typ av blobdataegenskap (Binary Large Object).
PX_Bool( ) Serialiserar en typ av boolesk egenskap.
PX_Color( ) Serialiserar en typfärgegenskap.
PX_Currency( ) Serialiserar en typ av CY-egenskap (valuta).
PX_Double( ) Serialiserar en typegenskap double .
PX_Font( ) Serialiserar en egenskap för teckensnittstyp.
PX_Float( ) Serialiserar en typegenskap float .
PX_IUnknown( ) Serialiserar en egenskap av typen LPUNKNOWN.
PX_Long( ) Serialiserar en typegenskap long .
PX_Picture( ) Serialiserar en typ av bildegenskap.
PX_Short( ) Serialiserar en typegenskap short .
PXstring( ) Serialiserar en typegenskap CString .
PX_ULong( ) Serialiserar en ULONG-typegenskap .
PX_UShort( ) Serialiserar typen USHORT-egenskap.

Mer information om dessa egenskapsutbytesfunktioner finns i Beständighet för OLE-kontroller i MFC-referensen.

Anpassa standardbeteendet för DoPropExchange

Standardimplementeringen av DoPropertyExchange (som du ser i föregående avsnitt) anropar basklassen COleControl. Detta serialiserar uppsättningen egenskaper som stöds automatiskt av COleControl, som använder mer lagringsutrymme än att serialisera endast kontrollens anpassade egenskaper. Om du tar bort det här anropet kan objektet endast serialisera de egenskaper som du anser vara viktiga. Inga standardegenskapstillstånd som kontrollen har implementerat kommer att serialiseras när du sparar eller läser in kontrollobjektet om du inte uttryckligen lägger till PX_-anrop för dem.

Implementera versionsstöd

Versionsstöd gör det möjligt för en reviderad ActiveX-kontroll att lägga till nya beständiga egenskaper och fortfarande kunna identifiera och läsa in det beständiga tillstånd som skapats av en tidigare version av kontrollen. Om du vill göra en kontrolls version tillgänglig som en del av dess beständiga data anropar du COleControl::ExchangeVersion i kontrollens DoPropExchange funktion. Det här anropet infogas automatiskt om ActiveX-kontrollen skapades med hjälp av ActiveX-kontrollguiden. Det kan tas bort om versionsstöd inte behövs. Kostnaden i kontrollstorleken är dock mycket liten (4 byte) för den extra flexibilitet som versionsstöd ger.

Om kontrollen inte har skapats med ActiveX-kontrollguiden, lägger du till ett anrop till COleControl::ExchangeVersion genom att infoga följande rad i början av DoPropExchange-funktionen (före anropet till COleControl::DoPropExchange):

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

Du kan använda valfritt DWORD som versionsnummer. Projekt som genereras av ActiveX-kontrollguiden använder _wVerMinor och _wVerMajor som standard. Det här är globala konstanter som definierats i implementeringsfilen för projektets ActiveX-kontrollklass. I resten av funktionen DoPropExchange kan du anropa CPropExchange::GetVersion när som helst för att hämta den version som du sparar eller hämtar.

I följande exempel har version 1 av den här exempelkontrollen endast egenskapen "ReleaseDate". Version 2 lägger till egenskapen "OriginalDate". Om kontrollen instrueras att läsa in det beständiga tillståndet från den gamla versionen initieras medlemsvariabeln för den nya egenskapen till ett standardvärde.

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

Som standard konverterar en kontroll gamla data till det senaste formatet. Om version 2 av en kontroll till exempel läser in data som sparats av version 1, skrivs formatet version 2 när det sparas igen. Om du vill att kontrollen ska spara data i formatet som lästes senast skickar du FALSE som en tredje parameter när du anropar ExchangeVersion. Den tredje parametern är valfri och är TRUE som standard.

Se även

MFC ActiveX-kontroller