MFC ActiveX コントロール : シリアル化
この技術情報は、 ActiveX コントロールをシリアル化する方法について説明します。シリアル化とは、ディスク ファイルなどの永続ストレージ メディアのへの読み取りまたは書き込みのプロセスです。Microsoft Foundation Class の (MFC) のライブラリは、クラス CObjectのシリアル化の組み込みサポートを提供します。COleControl は所持品の交換機能を使用して ActiveX コントロールにこのサポートを拡張します。
ActiveX コントロールのシリアル化は、オーバーライドの COleControl::DoPropExchangeによって実装されます。コントロール オブジェクトの読み込みと保存時に呼び出されるこの関数は、変更通知のメンバー変数とメンバー変数と実行されるすべてのプロパティを保存します。
次のトピックでは、 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.
}
プロパティを永続的に保存する場合は、所持品の交換の関数への呼び出しを追加することによって DoPropExchange を変更します。次の例は CircleShape のプロパティに TRUEの既定値がある CircleShape のカスタムのブール型プロパティのシリアル化を示しています:
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 () |
型の 倍精度浮動小数点型 のプロパティをシリアル化します。 |
PX_Font () |
フォントの型のプロパティをシリアル化します。 |
PX_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 コントロールを使用すると、コントロールの旧バージョンで作成された永続的な状態を検出し、読み込めます。コントロールのバージョンを、呼び出し COleControl::ExchangeVersion コントロールの DoPropExchange 関数で永続データの一部として使用できるようにします。この呼び出しは自動的に 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 です。