MFC モジュールの状態データの管理
更新 : 2007 年 11 月
ここでは、MFC モジュールの状態データについて説明すると共に、実行の流れ (実行時にコードがアプリケーション内をたどるパス) がモジュールに出入りするときにモジュールの状態がどのように更新されるかについて説明します。さらに、AFX_MANAGE_STATE マクロと METHOD_PROLOGUE マクロでモジュール状態を切り替える方法についても説明します。
メモ : |
---|
"モジュール" とは、アプリケーションの他の部分から独立して動作するが、MFC DLL の共有コピーを使用する実行可能プログラム、DLL、DLL の集合のいずれかのことです。モジュールの代表的な例は ActiveX コントロールです。 |
以下の図のように、MFC には、アプリケーション内のモジュールごとに状態データがあります。この状態データの内容は、Windows インスタンス ハンドル (リソースの読み込み用)、アプリケーションの現在の CWinApp オブジェクトと CWinThread オブジェクトへのポインタ、OLE モジュールの参照カウント、Windows オブジェクト ハンドルと MFC オブジェクトのインスタンス間の接続用の各種マップなどです。ただし、複数のモジュールを使用するアプリケーションの場合は、各モジュールの状態データはアプリケーション全体の状態を表すものではありません。モジュールごとに MFC の状態データのプライベート コピーを持っています。
単一モジュール (アプリケーション) の状態データ
モジュールの状態データは構造体に含まれます。この構造体へのポインタを使用して、いつでもこのデータにアクセスできます。以下の図のように、実行フローが特定のモジュールに入ったら、そのモジュールの状態を "現在の" つまり "有効" 状態にする必要があります。したがって、各スレッド オブジェクトには、アプリケーションの有効状態を示す構造体へのポインタがあります。このポインタを常に最新状態に保つことによって、アプリケーションのグローバル状態を管理し、各モジュールの状態の整合性を維持しています。グローバル状態を正しく管理しないと、アプリケーションが予測不能な動作を起こします。
複数モジュールの状態データ
つまり、各モジュールはそのすべてのエントリ ポイントにおいてモジュール状態を正しく切り替える必要があります。"エントリ ポイント" とは、実行の流れがモジュールのコードに入る場所を指します。以下のエントリ ポイントがあります。