MFC ActiveX 控制項:序列化

本文討論如何序列化 ActiveX 控制項。 序列化是讀取或寫入永續性儲存媒體的程式,例如磁片檔案。 Microsoft Foundation Class (MFC) 程式庫提供類別 中 CObject 序列化的內建支援。 COleControl 透過使用屬性交換器制,將此支援延伸至 ActiveX 控制項。

重要

ActiveX 是不應該用於新開發的舊版技術。 如需取代 ActiveX 的新式技術詳細資訊,請參閱 ActiveX 控制項

ActiveX 控制項的序列化是透過覆寫 COleControl::D oPropExchange 來實作。 此函式會在載入和儲存控制項物件期間呼叫,會儲存使用成員變數實作的所有屬性,或是含有變更通知的成員變數。

下列主題涵蓋與序列化 ActiveX 控制項相關的主要問題:

實作 DoPropExchange 函式

當您使用 ActiveX 控制項精靈產生控制項專案時,會自動將數個預設處理常式函式新增至控制項類別,包括 COleControl::D oPropExchange 的預設實作 。 下列範例顯示新增至使用 ActiveX 控制項精靈建立之類別的程式碼:

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

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

如果您想要讓屬性持續運作,請藉由新增對屬性交換函式的呼叫來修改 DoPropExchange 。 下列範例示範自訂 Boolean CircleShape 屬性的序列化,其中 CircleShape 屬性的預設值為 TRUE

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

下表列出可用來序列化控制項屬性的可能屬性交換函式:

屬性交換函式 目的
PX_Blob( ) 序列化二進位大型物件 (BLOB) 資料屬性類型。
PX_Bool( ) 序列化布林值型別屬性。
PX_Color( ) 序列化類型色彩屬性。
PX_Currency( ) 序列化類型 CY (currency) 屬性。
PX_Double( ) 序列化類型 double 屬性。
PX_Font( ) 序列化 Font 類型屬性。
PX_Float( ) 序列化類型 float 屬性。
PX_IUnknown( ) 序列化 類型的 LPUNKNOWN 屬性。
PX_Long( ) 序列化類型 long 屬性。
PX_Picture( ) 序列化 Picture 屬性類型。
PX_Short( ) 序列化類型 short 屬性。
PXstring( ) 序列化類型 CString 屬性。
PX_ULong( ) 序列化類型 ULONG 屬性。
PX_UShort( ) 序列化 USHORT 屬性類型

如需這些屬性交換函式的詳細資訊,請參閱 MFC 參考 中的 OLE 控制項 持續性。

自訂 DoPropExchange 的預設行為

的預設實 DoPropertyExchange 作 (如上一個主題所示) 會呼叫基類 COleControl 。 這會自動序列化 所 COleControl 支援的屬性集,這個屬性會使用比只序列化 控制項的自訂屬性更多的儲存空間。 移除此呼叫可讓您的物件只序列化您考慮的重要屬性。 儲存或載入控制項物件時,不會序列化控制項實作的任何庫存屬性,除非您明確新增 PX_ 呼叫控制項。

實作版本支援

版本支援可讓修訂的 ActiveX 控制項加入新的永續性屬性,而且仍然可以偵測及載入舊版控制項所建立的持續性狀態。 若要讓控制項的版本成為其永續性資料的一部分,請在控制項的 DoPropExchange 函式中呼叫 COleControl::ExchangeVersion 。 如果使用 ActiveX 控制項精靈建立 ActiveX 控制項,則會自動插入此呼叫。 如果不需要版本支援,則可以將其移除。 不過,對於版本支援所提供的額外彈性,控制大小的成本非常小(4 個位元組)。

如果未使用 ActiveX 控制項精靈建立控制項,請在函 DoPropExchange 式開頭插入下列程式程式碼來新增 呼叫 COleControl::ExchangeVersion (在 呼叫 COleControl::DoPropExchange 之前):

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

您可以使用任何 DWORD 作為版本號碼。 ActiveX 控制項精靈所產生的專案會使用 _wVerMinor_wVerMajor 作為預設值。 這些是專案 ActiveX 控制項類別實作檔中定義的全域常數。 在函 DoPropExchange 式的其餘部分內,您可以隨時呼叫 CPropExchange::GetVersion 來擷取您要儲存或擷取的版本。

在下列範例中,此範例控制項的第 1 版只有 「ReleaseDate」 屬性。 第 2 版會新增 「OriginalDate」 屬性。 如果指示控制項從舊版載入持續性狀態,它會將新屬性的成員變數初始化為預設值。

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

根據預設,控制項會將舊資料「轉換成最新的格式」。 例如,如果控制項第 2 版載入第 1 版所儲存的資料,則會在再次儲存時寫入第 2 版格式。 如果您想要讓控制項以上次讀取的格式儲存資料,請在呼叫 ExchangeVersion 時傳遞 FALSE 做為第三個參數。 第三個參數是選擇性的,預設為 TRUE

另請參閱

MFC ActiveX 控制項