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

この記事では、MFC モジュールの状態データと、実行フロー (実行中にコードがアプリケーションを通過するパス) がモジュールに入り、モジュールを離れるときに、この状態がどのように更新されるのかについて説明します。 AFX_MANAGE_STATE マクロと METHOD_PROLOGUE マクロを使用したモジュールの状態の切り替えについても説明します。

Note

ここでは、「モジュール」という用語は、実行可能プログラム、またはアプリケーションの残りの部分とは独立して動作するが MFC DLL の共有コピーを使用する DLL (または DLL のセット) を指します。 ActiveX コントロールは、モジュールの典型的な例です。

次の図に示すように、MFC には、アプリケーションで使用されるモジュールごとに状態データがあります。 このデータの例としては、Windows インスタンス ハンドル (リソースの読み込みに使用)、アプリケーションの現在の CWinApp オブジェクトと CWinThread オブジェクトへのポインター、OLE モジュール参照数、および Windows オブジェクト ハンドルと MFC オブジェクトの対応するインスタンス間の接続を維持するさまざまなマップがあります。 ただし、アプリケーションで複数のモジュールを使用する場合、各モジュールの状態データはアプリケーション全体を対象としたものではありません。 そうではなく、各モジュールには、MFC 状態データの独自のプライベート コピーがあります。

Diagram showing the state data of a single module.
単一モジュール (アプリケーション) の状態データ

モジュールの状態データは構造体に含まれており、その構造体へのポインターを介して常に使用できます。 次の図に示すように、実行フローが特定のモジュールに入るときは、そのモジュールの状態は「現在」または「有効」の状態である必要があります。 このため、各スレッド オブジェクトには、そのアプリケーションの有効な状態構造体へのポインターがあります。 このポインターを常に最新の状態に保つのは、アプリケーションのグローバル状態を管理し、各モジュールの状態の整合性を維持するために不可欠です。 グローバル状態の管理が不適切であれば、予期しないアプリケーション動作が発生する可能性があります。

State data of multiple modules.
複数モジュールの状態データ

つまり、各モジュールは、すべてのエントリ ポイントでモジュールの状態を正しく切り替える必要があります。 「エントリ ポイント」は、実行フローがモジュールのコードを入力できる任意の場所です。 エントリ ポイントの例を以下に示します。

関連項目

MFC の一般的なトピック