次の方法で共有


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

ここでは、ActiveX コントロールをシリアル化する方法について説明します。 シリアル化とは、ディスク ファイルなどの永続的な記憶域媒体に対する読み書きの操作です。 MFC (Microsoft Foundation Class) ライブラリでは、CObject クラスにシリアル化のサポートが組み込まれています。 COleControl は、プロパティ交換機構を使用することによって、シリアル化を ActiveX コントロールまで拡張してサポートしています。

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

ActiveX コントロールのシリアル化に関する主な問題については、以下のトピックを参照してください。

  • DoPropExchange 関数の実装によるコントロール オブジェクトのシリアル化

  • シリアル化プロセスのカスタマイズ

  • バージョン サポートの実装

DoPropExchange 関数の実装

ActiveX コントロール ウィザードを使ってコントロール プロジェクトを生成すると、既定のハンドラー関数がいくつか自動的にコントロール クラスに追加されます。このとき、COleControl::DoPropExchange の既定の実装も追加されます。 たとえば、次のようなコードが追加されます。

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( )

通貨型 (Currency) のプロパティのシリアル化。

PX_Double( )

倍精度浮動小数点数型のプロパティのシリアル化。

PX_Font( )

フォント型のプロパティのシリアル化。

PX_Float( )

浮動小数点数型のプロパティのシリアル化。

PX_IUnknown( )

LPUNKNOWN 型のプロパティのシリアル化。

PX_Long( )

長整数型のプロパティのシリアル化。

PX_Picture( )

ピクチャ型のプロパティのシリアル化。

PX_Short( )

short 型のプロパティのシリアル化。

PX_String( )

CString 型のプロパティのシリアル化。

PX_ULong( )

ULONG 型のプロパティのシリアル化。

PX_UShort( )

USHORT 型のプロパティのシリアル化。

これらのプロパティ エクスチェンジ関数の詳細については、『MFC リファレンス』の「OLE コントロールの永続化」を参照してください。

DoPropExchange の既定の動作のカスタマイズ

上のトピックで説明した DoPropertyExchange の既定の実装は、基本クラスの COleControl を呼び出します。 これにより、COleControl によって自動的にサポートされる一連のプロパティがシリアル化されます。この場合、コントロールのカスタム プロパティだけをシリアル化する場合に比べて多くの記憶領域が使用されます。 この呼び出しを削除すると、重要なプロパティだけをシリアル化できます。 コントロールが実装したストック プロパティの状態は、PX_ の呼び出しを明示的に追加しない限り、コントロール オブジェクトの保存や読み込みのときにシリアル化されません。

バージョン サポートの実装

バージョン サポートを実装すると、改訂された ActiveX コントロールに新しい永続プロパティを追加できます。新しいプロパティを追加した後も、以前のバージョンのコントロールによって作成された永続状態を引き続き検出したり読み込んだりできます。 コントロールのバージョンを永続データの一部として使用できるようにするには、コントロールの DoPropExchange 関数で COleControl::ExchangeVersion を呼び出します。 ActiveX コントロール ウィザードを使って ActiveX コントロールを作成した場合は、この呼び出しが自動的に挿入されます。 バージョン サポートが必要ない場合には、この呼び出しを削除してもかまいません。 ただし、バージョン サポートによってもたらされる柔軟性に比べると、コントロールのサイズの増加は 4 バイトとごくわずかに過ぎません。

コントロールを作成するときに ActiveX コントロール ウィザードを使用しなかった場合は、DoPropExchange 関数の先頭 (COleControl::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 を渡します。 このパラメーターは省略可能で、既定値は TRUE です。

参照

概念

MFC ActiveX コントロール