MFC モジュールの状態データの管理

更新 : 2007 年 11 月

ここでは、MFC モジュールの状態データについて説明すると共に、実行の流れ (実行時にコードがアプリケーション内をたどるパス) がモジュールに出入りするときにモジュールの状態がどのように更新されるかについて説明します。さらに、AFX_MANAGE_STATE マクロと METHOD_PROLOGUE マクロでモジュール状態を切り替える方法についても説明します。

0asx94f7.alert_note(ja-jp,VS.90).gifメモ :

"モジュール" とは、アプリケーションの他の部分から独立して動作するが、MFC DLL の共有コピーを使用する実行可能プログラム、DLL、DLL の集合のいずれかのことです。モジュールの代表的な例は ActiveX コントロールです。

以下の図のように、MFC には、アプリケーション内のモジュールごとに状態データがあります。この状態データの内容は、Windows インスタンス ハンドル (リソースの読み込み用)、アプリケーションの現在の CWinApp オブジェクトと CWinThread オブジェクトへのポインタ、OLE モジュールの参照カウント、Windows オブジェクト ハンドルと MFC オブジェクトのインスタンス間の接続用の各種マップなどです。ただし、複数のモジュールを使用するアプリケーションの場合は、各モジュールの状態データはアプリケーション全体の状態を表すものではありません。モジュールごとに MFC の状態データのプライベート コピーを持っています。

単一モジュール (アプリケーション) の状態データ
単一モジュール アプリケーション状態データ

モジュールの状態データは構造体に含まれます。この構造体へのポインタを使用して、いつでもこのデータにアクセスできます。以下の図のように、実行フローが特定のモジュールに入ったら、そのモジュールの状態を "現在の" つまり "有効" 状態にする必要があります。したがって、各スレッド オブジェクトには、アプリケーションの有効状態を示す構造体へのポインタがあります。このポインタを常に最新状態に保つことによって、アプリケーションのグローバル状態を管理し、各モジュールの状態の整合性を維持しています。グローバル状態を正しく管理しないと、アプリケーションが予測不能な動作を起こします。

複数モジュールの状態データ
複数モジュール状態データ

つまり、各モジュールはそのすべてのエントリ ポイントにおいてモジュール状態を正しく切り替える必要があります。"エントリ ポイント" とは、実行の流れがモジュールのコードに入る場所を指します。以下のエントリ ポイントがあります。

参照

概念

MFC の一般的なトピック