この記事では、MFC モジュールの状態データと、実行フロー (実行時にパス コードがアプリケーションを通過する) がモジュールに入ってモジュールを離れたときに、この状態がどのように更新されるかについて説明します。 AFX_MANAGE_STATEマクロとMETHOD_PROLOGUE マクロを使用したモジュールの状態の切り替えについても説明します。
注
ここでの "モジュール" という用語は、実行可能プログラム、またはアプリケーションの残りの部分とは独立して動作するが、MFC DLL の共有コピーを使用する DLL (または DLL のセット) を指します。 ActiveX コントロールは、モジュールの典型的な例です。
次の図に示すように、MFC には、アプリケーションで使用される各モジュールの状態データがあります。 このデータの例には、Windows インスタンス ハンドル (リソースの読み込みに使用)、アプリケーションの現在の CWinApp
オブジェクトと CWinThread
オブジェクトへのポインター、OLE モジュール参照カウント、および Windows オブジェクト ハンドルと MFC オブジェクトの対応するインスタンス間の接続を維持するさまざまなマップが含まれます。 ただし、アプリケーションが複数のモジュールを使用する場合、各モジュールの状態データはアプリケーション全体ではありません。 代わりに、各モジュールには MFC の状態データの独自のプライベート コピーがあります。
単一モジュールの状態データ (アプリケーション)
モジュールの状態データは構造体に含まれており、その構造体へのポインターを介して常に使用できます。 次の図に示すように、実行フローが特定のモジュールに入った場合、そのモジュールの状態は "現在" または "有効" 状態である必要があります。 そのため、各スレッド オブジェクトには、そのアプリケーションの有効な状態構造へのポインターがあります。 このポインターを常に更新しておくことは、アプリケーションのグローバル状態を管理し、各モジュールの状態の整合性を維持するために不可欠です。 グローバル状態の管理が正しくないと、予期しないアプリケーション動作が発生する可能性があります。
複数モジュールの状態データ
つまり、各モジュールは、すべてのエントリ ポイントでモジュールの状態を正しく切り替える必要があります。 "エントリ ポイント" は、実行フローがモジュールのコードを入力できる任意の場所です。 エントリーポイントは次のとおりです。