本文讨論序列化 ActiveX 控件的方法。序列化是從持久性存儲媒體(如磁盤檔案)中讀取或向其中寫入的程序。Microsoft 基礎類 (MFC) 庫在 CObject 類中為序列化提供内置支援。COleControl 通過使用屬性交換機制,将此支援擴充到 ActiveX 控件。
通過重寫 COleControl::DoPropExchange 實作 ActiveX 控件的序列化。在加載和儲存控件對象期間調用此函數,以存儲用成員變量或用帶更改通知的成員變量實作的所有屬性。使用者可以對控件進行序列化以記錄控件的狀态。
下列主題介紹與序列化 ActiveX 控件相關的主要問題:
實作 <code>DoPropExchange</code>函數以序列化控件對象
<a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_activex_controls.3a_.serializing.asp?frame=true#_core_customizing_the_default_%20_of_dopropexchange">自定義序列化過程</a>
<a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_activex_controls.3a_.serializing.asp?frame=true#_core_implementing_version_support">實作版本支援</a>
當使用“ActiveX 控件向導”生成控件項目時,幾個預設處理函數被自動添加到控件類,包括 COleControl::DoPropExchange 的預設實作。下例顯示添加到用“ActiveX 控件向導”建立的類的代碼:
如果要使屬性持久,則通過添加對屬性交換函數的調用來修改 <code>DoPropExchange</code>。下例說明自定義布爾 CircleShape 屬性的序列化,這裡 CircleShape 屬性的預設值為 TRUE:
下表列出了可用于序列化控件屬性的可能的屬性交換函數:
屬性交換函數
目的
PX_Blob( )
序列化二進制大對象 (BLOB) 類型資料屬性。
PX_Bool( )
序列化布爾類型屬性。
PX_Color( )
序列化顔色類型屬性。
PX_Currency( )
序列化 CY(貨币)類型屬性。
PX_Double( )
序列化 double 類型屬性。
PX_Font( )
序列化 Font 類型屬性。
PX_Float( )
序列化 float 類型屬性。
PX_IUnknown( )
序列化 LPUNKNOWN 類型屬性。
PX_Long( )
序列化 long 類型屬性。
PX_Picture( )
序列化 Picture 類型屬性。
PX_Short( )
序列化 short 類型屬性。
PX_String( )
序列化 CString 類型屬性。
PX_ULong( )
序列化 ULONG 類型屬性。
PX_UShort( )
序列化 USHORT 類型屬性。
有關這些屬性交換函數的更多資訊,請參見“MFC 參考”中的 OLE 控件的持久性。
DoPropertyExchange 的預設實作(如上一主題所示)調用 COleControl 基類。此操作序列化 COleControl 自動支援的屬性集,所使用的存儲空間比隻序列化控件的自定義屬性多。移除此調用使您的對象得以隻序列化您認為重要的那些屬性。儲存或加載控件對象時,除非對控件已實作的任何常用屬性狀态顯式添加 PX_ 調用,否則将不會序列化它們。
版本支援使修訂過的 ActiveX 控件得以添加新的持久性屬性,并仍可以檢測和加載由早期版本的控件建立的持久性狀态。若要使控件的版本可用作其持久性資料的一部分,請在控件的 <code>DoPropExchange</code> 函數中調用 COleControl::ExchangeVersion。如果 ActiveX 控件是用“ActiveX 控件向導”建立的,則将自動插入此調用。如果不需要版本支援,可移除此調用。但是,控件大小的成本對于版本支援所提供的額外靈活性非常小(4 個位元組)。
如果控件不是用“ActiveX 控件向導”建立的,則通過在 <code>DoPropExchange</code> 函數的開始處(在調用 COleControl::DoPropExchange 之前)插入下行來添加對 COleControl::ExchangeVersion 的調用:
可以使用任何 DWORD 作為版本号。“ActiveX 控件向導”所生成的項目使用 _wVerMinor 和 _wVerMajor 作為預設值。_wVerMinor 和 _wVerMajor 是在項目的 ActiveX 控件類的實作檔案中定義的全局常數。在 <code>DoPropExchange</code> 函數的其餘部分,可以随時調用 CPropExchange::GetVersion 檢索正在儲存或檢索的版本。
在下例中,此示例控件的版本 1 僅有“ReleaseDate”屬性。版本 2 添加了“OriginalDate”屬性。如果訓示控件從舊版本加載持久性狀态,則控件将新屬性的成員變量初始化為預設值。
預設情況下,控件将舊資料“轉換”成最新格式。例如,如果控件的版本 2 加載由版本 1 儲存的資料,則資料再次儲存時将寫成版本 2 的格式。如果希望控件以上次讀取的格式儲存資料,則在調用 ExchangeVersion 時将 FALSE 作為第三個參數傳遞。此第三個參數是可選的,預設值為 TRUE。
另:屬性頁交換函數
屬性頁上的控件變量與ActiveX控件的屬性建立聯系使用DDP_ 函數。
如:DDP_Text(pDX,IDC_CODE,m_code,_T("CodeString")); 是将m_code與屬性CodeString建立聯系。
常用屬性頁交換函數:
函 數 名
函數的作用
DDP_CBIndex
連結組合框中標明字元串的索引與控件屬性
DDP_CBString
連結組合框中的標明字元串與控件屬性。所選字元串可以以與屬性值相同的字母開始,但不必完全與其比對
DDP_CBStringExact
連結組合框中的標明字元串與控件屬性。所選字元串和屬性的字元串值必須完全比對
DDP_Check
連結複選框與控件屬性
DDP_LBIndex
連結清單框中標明字元串的索引與控件屬性
DDP_LBString
連結清單框中的標明字元串與控件屬性。所選字元串可以以與屬性值相同的字母開始,但不必完全與其比對
DDP_LBStringExact
連結清單框中的標明字元串與控件屬性。所選字元串和屬性的字元串值必須完全比對
DDP_Radio
連結單選按鈕與控件屬性
DDP_Text