MFC ActiveX コントロール : シリアル化

このアーティクルでは、ActiveX コントロールをシリアル化する方法について説明します。 シリアル化は、ディスク ファイルなどの永続的なストレージ メディアから読み取りまたは書き込みを行うプロセスです。 Microsoft Foundation Class (MFC) ライブラリは、クラス CObject のシリアル化をビルトインでサポートします。 COleControl では、プロパティ交換メカニズムを使用して ActiveX コントロールを制御するために、このサポートが拡張されています。

重要

ActiveX は、新しい開発には使用すべきではないレガシ テクノロジです。 ActiveX に取って代わる最新のテクノロジの詳細については、「ActiveX コントロール」を参照してください。

ActiveX のシリアル化は、COleControl::DoPropExchange をオーバーライドすることで実装されます。 この関数は、コントロール オブジェクトの読み込みと保存時に呼び出され、メンバー変数またはメンバー変数で実装されたプロパティと変更通知を格納します。

次のトピックでは、ActiveX コントロールのシリアル化に関する主な事項を説明します:

DoPropExchange 関数の実装

ActiveX コントロール ウィザードでコントロール プロジェクトを生成すると、COleControl::DoPropExchange の既定の実装を含む、いくつかの既定のハンドラー関数がコントロール クラスに自動的に追加されます。 次の例は、ActiveX コントロール ウィザードを使用して作成されたクラスにコードを追加しています。

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

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

プロパティを永続的にする場合は、プロパティ交換関数への呼び出しを追加して DoPropExchange を変更します。 次の例は、カスタムのブール型 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 (通貨) プロパティをシリアル化します。
PX_Double( ) double プロパティをシリアル化します。
PX_Font( ) フォント型プロパティをシリアル化します。
PX_Float( ) float プロパティをシリアル化します。
PX_IUnknown( ) LPUNKNOWN のプロパティをシリアル化します。
PX_Long( ) long プロパティをシリアル化します。
PX_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 コントロール ウィザードでコントロールが作成されていない場合は、COleControl::DoPropExchange への呼び出しの前に、DoPropExchange 関数の最初に次の行を挿入し COleControl::ExchangeVersion への呼び出しを追加します。

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

既定では、コントロールは古いデータを最新の形式に "変換" します。 例えば、バージョン 1 で保存したデータをバージョン 2 のコントロールで読み込むと、再度保存する際にバージョン 2 のフォーマットで書き込まれます。 コントロールで最後に読み取った形式でデータを保存する場合は、ExchangeVersion を呼び出す際に 3 番目のパラメーターとして FALSE を渡します。 この 3 番目のパラメーターは省略可能で、既定では TRUE です。

関連項目

MFC ActiveX コントロール