次の方法で共有


DLL のエクスポート関数のエントリ ポイント

DLL のエクスポート関数の場合、 DLL モジュールから呼び出し元のアプリケーションの DLL に切り替えると、適切なグローバル状態を維持するために AFX_MANAGE_STATE のマクロを使用します。

呼び出された場合、このマクロは関数のコンテナー スコープの剰余のようなモジュール状態として pModuleStateのモジュールの AFX_MODULE_STATE の含む構造体のグローバル データへのポインターを設定します。マクロを含むスコープを離れた上で前のようなモジュール状態が自動的に復元されます。

この遷移はスタックの AFX_MODULE_STATE のクラスのインスタンスを作成することで実現されます。コンストラクターで、このクラスは、現在のモジュール状態とストアへのポインターをメンバー変数の、取得し、新しい的なモジュール状態として pModuleState を設定します。デストラクターでは、このクラスに効果的なモジュール状態としてメンバー変数に格納されているポインターを復元します。

エクスポート関数がある場合、 DLL のダイアログ ボックスを表示し、 1 種類のような、関数の開始に次のコードを追加する必要があります:

AFX_MANAGE_STATE(AfxGetStaticModuleState( ))

これは、現在のスコープを閉じるまでの AfxGetStaticModuleState から返される状態を持つ現在のモジュール状態を交換します。

DLL のリソースに問題が AFX_MANAGE_STATE のマクロが使用されていない場合に発生します。既定では、 MFC はリソース テンプレートを読み込むメイン アプリケーションのリソース ハンドルを使用します。このテンプレートは、 DLL に実際に格納されます。根本原因は、 MFC のモジュール状態情報が AFX_MANAGE_STATE マクロで切替えられなかったことです。リソース ハンドルは、 MFC のモジュール状態から復元します。モジュール状態を切替えないと、誤ったリソース ハンドルを使用します。

AFX_MANAGE_STATE は、 DLL の関数に送信する必要はありません。たとえば、 InitInstance は AFX_MANAGE_STATE を含まないアプリケーションの MFC コードによって MFC が InitInstance の前に自動的にモジュール状態をシフトし、 InitInstance の戻りの後に切り替えるため呼び出すことができます。これは、すべてのメッセージマップ ハンドラーにも当てはまります。レギュラー DLL に実際にメッセージをルーティングする前に自動的にモジュール状態を切り替える特別なマスターのウィンドウ プロシージャがあります。

参照

概念

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