次の方法で共有


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

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

Von Bedeutung

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 を変更します。 次の例では、カスタムのブール型 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( ) 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 を呼び出します。 ActiveX コントロール ウィザードを使用して ActiveX コントロールが作成された場合、この呼び出しは自動的に挿入されます。 バージョンのサポートが必要ない場合は削除できます。 ただし、バージョン サポートが提供する柔軟性を高めるために、コントロール サイズのコストは非常に小さい (4 バイト) です。

ActiveX コントロール ウィザードでコントロールが作成されていない場合は、COleControl::ExchangeVersion関数の先頭 (DoPropExchangeの呼び出しの前) に次の行を挿入して、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 の形式が書き込まれます。 コントロールで最後の読み取り形式でデータを保存する場合は、を呼び出すときに 3 番目のパラメーターとして ExchangeVersion渡します。 この 3 番目のパラメーターは省略可能であり、既定では TRUE です。

こちらも参照ください

MFC ActiveX コントロール