MFC-ActiveX-Steuerelemente: Serialisierung

In diesem Artikel wird erläutert, wie Sie ein ActiveX-Steuerelement serialisieren. Serialisierung ist der Prozess des Lesens von oder Schreiben in ein beständiges Speichermedium, z. B. eine Datenträgerdatei. Die Microsoft Foundation Class (MFC)-Bibliothek bietet integrierte Unterstützung für die Serialisierung in der Klasse CObject. COleControl erweitert diese Unterstützung auf ActiveX-Steuerelemente über die Verwendung eines Eigenschaftenaustauschmechanismus.

Wichtig

ActiveX ist eine Legacytechnologie, die nicht für neue Software verwendet werden sollte. Weitere Informationen zu modernen Technologien, die ActiveX ablösen, finden Sie unter ActiveX-Steuerelemente.

Serialisierung für ActiveX-Steuerelemente wird durch Überschreiben von COleControl::D oPropExchange implementiert. Diese Funktion, die beim Laden und Speichern des Steuerelementobjekts aufgerufen wird, speichert alle Eigenschaften, die mit einer Membervariable oder einer Membervariable mit Änderungsbenachrichtigung implementiert wurden.

In den folgenden Themen werden die Standard Probleme im Zusammenhang mit der Serialisierung eines ActiveX-Steuerelements behandelt:

Implementieren der DoPropExchange-Funktion

Wenn Sie den ActiveX-Steuerelement-Assistenten zum Generieren des Steuerelementprojekts verwenden, werden der Steuerelementklasse automatisch mehrere Standardhandlerfunktionen hinzugefügt, einschließlich der Standardimplementierung von COleControl::D oPropExchange. Das folgende Beispiel zeigt den Code, der klassen hinzugefügt wurde, die mit dem ActiveX-Steuerelement-Assistenten erstellt wurden:

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

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

Wenn Sie eine Eigenschaft dauerhaft erstellen möchten, ändern DoPropExchange Sie diese, indem Sie einen Aufruf der Eigenschaftsaustauschfunktion hinzufügen. Im folgenden Beispiel wird die Serialisierung einer benutzerdefinierten booleschen CircleShape-Eigenschaft veranschaulicht, bei der die CircleShape-Eigenschaft den Standardwert TRUE aufweist:

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

In der folgenden Tabelle sind die möglichen Eigenschaftenaustauschfunktionen aufgeführt, die Sie zum Serialisieren der Eigenschaften des Steuerelements verwenden können:

Eigenschaftenaustauschfunktionen Zweck
PX_Blob( ) Serialisiert eine Typ-BLOB-Dateneigenschaft (Binary Large Object).
PX_Bool( ) Serialisiert eine boolesche Eigenschaft.
PX_Color( ) Serialisiert eine Typfarbeigenschaft.
PX_Currency( ) Serialisiert eine CY -Eigenschaft (Currency).
PX_Double( ) Serialisiert eine Typeigenschaft double .
PX_Font( ) Serialisiert eine Schriftarttypeigenschaft.
PX_Float( ) Serialisiert eine Typeigenschaft float .
PX_IUnknown( ) Serialisiert eine Eigenschaft vom Typ LPUNKNOWN.
PX_Long( ) Serialisiert eine Typeigenschaft long .
PX_Picture( ) Serialisiert eine Eigenschaft vom Typ "Picture".
PX_Short( ) Serialisiert eine Typeigenschaft short .
PXstring( ) Serialisiert eine Typeigenschaft CString .
PX_ULong( ) Serialisiert eine ULONG-Typeigenschaft.
PX_UShort( ) Serialisiert eine USHORT-Typeigenschaft.

Weitere Informationen zu diesen Eigenschaftenaustauschfunktionen finden Sie unter Persistenz von OLE-Steuerelementen in der MFC-Referenz.

Anpassen des Standardverhaltens von DoPropExchange

Die Standardimplementierung von DoPropertyExchange (wie im vorherigen Thema gezeigt) führt einen Aufruf der Basisklasse COleControldurch. Dadurch wird der Satz von Eigenschaften automatisch unterstützt COleControl, der mehr Speicherplatz verwendet, als nur die benutzerdefinierten Eigenschaften des Steuerelements zu serialisieren. Durch das Entfernen dieses Aufrufs kann Ihr Objekt nur die Eigenschaften serialisieren, die Sie als wichtig erachten. Alle Bestandseigenschaftenzustände, die das Steuerelement implementiert hat, werden beim Speichern oder Laden des Steuerelementobjekts nicht serialisiert, es sei denn, Sie fügen explizit PX_ Aufrufe hinzu.

Implementieren der Versionsunterstützung

Die Versionsunterstützung ermöglicht ein überarbeitetes ActiveX-Steuerelement zum Hinzufügen neuer persistenter Eigenschaften und kann den persistenten Zustand, der von einer früheren Version des Steuerelements erstellt wurde, weiterhin erkennen und laden. Um die Version eines Steuerelements als Teil seiner persistenten Daten verfügbar zu machen, rufen Sie COleControl::ExchangeVersion in der Funktion des Steuerelements DoPropExchange auf. Dieser Aufruf wird automatisch eingefügt, wenn das ActiveX-Steuerelement mithilfe des ActiveX-Steuerelement-Assistenten erstellt wurde. Sie kann entfernt werden, wenn keine Versionsunterstützung erforderlich ist. Die Kosten für die Steuerungsgröße sind jedoch sehr klein (4 Byte) für die zusätzliche Flexibilität, die die Versionsunterstützung bietet.

Wenn das Steuerelement nicht mit dem ActiveX-Steuerelement-Assistenten erstellt wurde, fügen Sie einen Aufruf COleControl::ExchangeVersion hinzu, indem Sie die folgende Zeile am Anfang der DoPropExchange Funktion (vor dem Aufruf von COleControl::DoPropExchange):

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

Sie können ein beliebiges DWORD als Versionsnummer verwenden. Projekte, die vom ActiveX-Steuerelement-Assistenten generiert werden, verwenden _wVerMinor und _wVerMajor als Standard. Hierbei handelt es sich um globale Konstanten, die in der Implementierungsdatei der ActiveX-Steuerelementklasse des Projekts definiert sind. Innerhalb des re Standard der Ihrer DoPropExchange Funktion können Sie CPropExchange::GetVersion jederzeit aufrufen, um die Version abzurufen, die Sie speichern oder abrufen.

Im folgenden Beispiel verfügt Version 1 dieses Beispielsteuerelements nur über eine "ReleaseDate"-Eigenschaft. Version 2 fügt eine "OriginalDate"-Eigenschaft hinzu. Wenn das Steuerelement angewiesen wird, den persistenten Zustand aus der alten Version zu laden, initialisiert es die Membervariable für die neue Eigenschaft auf einen Standardwert.

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

Standardmäßig konvertiert ein Steuerelement alte Daten in das neueste Format. Wenn z. B. Version 2 eines Steuerelements Daten lädt, die von Version 1 gespeichert wurden, schreibt es das Version 2-Format, wenn es erneut gespeichert wird. Wenn das Steuerelement Daten im Format speichern soll, das zuletzt gelesen wurde, übergeben Sie FALSE als dritten Parameter beim Aufrufen ExchangeVersion. Dieser dritte Parameter ist optional und standardmäßig TRUE .

Siehe auch

MFC ActiveX Controls (MFC-ActiveX-Steuerelemente)