次の方法で共有


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

ここでは、ActiveX コントロールをシリアル化する方法について説明します。 シリアル化は、ディスク ファイルのような永続ストレージ メディアのへの読み取りおよび書き込みのプロセスです。 Microsoft Foundation Class (MFC) ライブラリはクラス CObjectのシリアル化の組み込みサポートを提供します。 COleControl は 所持品の交換機構を使用して、ActiveX コントロールにこのサポートを拡張します。

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

次のトピックでは、ActiveX コントロールのシリアル化の主要な問題について説明します。:

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

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

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

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

プロパティを永続的にする場合は、所持品 swap 関数への呼び出しを追加して、DoPropExchange を変更します。 次の例では CircleShape のプロパティに TRUEの既定値がある CircleShape Boolean プロパティのカスタムのシリアル化を示します。、:

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


...


   PX_Bool(pPX, _T("CircleShape"), m_bCircleShape, TRUE);
}

次の表は、コントロールのプロパティをシリアル化するために使用できる有効な所持品の swap 関数の一覧です:

所持品の swap 関数

目的

PX_Blob ()

型のバイナリ ラージ オブジェクト (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 のプロパティをシリアル化します。

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::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を呼び出す場合は、3 番目のパラメーターとして FALSE を渡します。 3 番目のパラメーターは省略可能に既定で TRUE です。

参照

概念

MFC ActiveX コントロール