MFC と動的にリンクされる標準 MFC DLL
MFC に動的にリンクされる標準 MFC DLL は、MFC を内部で使用する DLL であり、その DLL 内のエクスポートされた関数は、MFC または非 MFC 実行可能ファイルから呼び出すことができます。 名前が示すとおり、この種の DLL は、MFC のダイナミックリンク ライブラリ バージョン (MFC の共有バージョンとも呼ばれます) を使用してビルドされます。 通常、関数は標準の C インターフェイスを使用して標準 MFC DLL からエクスポートされます。
MFC に動的にリンクされる標準 MFC Dll 内のエクスポートされたすべての関数の先頭に AFX_MANAGE_STATE
マクロを追加して、現在のモジュールの状態を DLL の状態に設定する必要があります。 これを行うには、DLL からエクスポートされた関数の先頭に次のコード行を追加します。
AFX_MANAGE_STATE(AfxGetStaticModuleState( ))
MFC に動的にリンクされる標準 MFC DLL には、次の特徴があります。
これは、Visual C++ 4.0 で導入された新しい種類の DLL です。
クライアント実行可能ファイルは、DLL (C、C++、Pascal、Visual Basic など) の使用をサポートする任意の言語で記述できます。MFC アプリケーションである必要はありません。
静的にリンクされる標準 MFC DLL とは異なり、この種類の DLL は、MFC DLL (共有 MFC DLL とも呼ばれます) に動的にリンクされます。
この種類の DLL にリンクされている MFC インポート ライブラリは、MFC 拡張 DLL または MFC DLL を使用するアプリケーションで使用されるのと同じです: MFCxx(D).lib)。
MFC に動的にリンクされる標準 MFC DLL には、次の要件があります。
MFC DLL に動的にリンクされる実行可能ファイルと同様、これらの DLL も、_AFXDLLを定義してコンパイルされます。 ただし、MFC に静的にリンクされる標準 MFC DLL と同様、_USRDLL も定義されます。
この種類の DLL は、
CWinApp
派生クラスをインスタンス化する必要があります。この種類の DLL では、MFC から提供される
DllMain
を使用します。 通常の MFC アプリケーションと同様、すべての DLL 固有の初期化コードをInitInstance
メンバー関数内に配置し、終了コードをExitInstance
内に配置します。
この種類の DLL では、MFC のダイナミックリンク ライブラリ バージョンが使用されるため、現在のモジュールの状態を DLL の状態に明示的に設定する必要があります。 これを行うには、DLL からエクスポートされたすべての関数の先頭に AFX_MANAGE_STATE マクロを使用します。
標準 MFC DLL には、MFC アプリケーションと同様に、CWinApp
派生クラスと、そのアプリケーション クラスの 1 つのオブジェクトが必要です。 ただし、DLL の CWinApp
オブジェクトは、アプリケーションの CWinApp
オブジェクトとは異なり、メイン メッセージ ポンプはありません。
アプリケーションにはメイン メッセージ ポンプがあるため、CWinApp::Run
メカニズムは DLL に適用されないことに注意してください。 DLL がモードレス ダイアログを開く場合、または独自のメイン フレーム ウィンドウがある場合、アプリケーションのメイン メッセージ ポンプは、DLL によってエクスポートされたルーチンを呼び出し、そのルーチンが CWinApp::PreTranslateMessage
を呼び出す必要があります。
通常の MFC アプリケーションと同様、すべての DLL 固有の初期化コードを CWinApp::InitInstance
メンバー関数内に配置します。 CWinApp
派生クラスの CWinApp::ExitInstance
メンバー関数は、DLL がアンロードされる前に、MFC によって提供される DllMain
関数から呼び出されます。
アプリケーションと共に、共有 DLL の MFCx0.dll と Msvcr*0.dll (または同様のファイル) を配布する必要があります。
MFC に動的にリンクされた DLL をさらに静的に MFC にリンクすることはできません。 アプリケーションは、他の DLL と同様に、MFC に動的にリンクされた標準 MFC DLL にリンクします。
通常、シンボルは、標準の C インターフェイスを使用して標準 MFC DLL からエクスポートされます。 標準 MFC DLL からエクスポートされた関数の宣言は、次のようになります。
extern "C" __declspec(dllexport) MyExportedFunction( );
標準 MFC DLL 内のメモリ割り当てはすべて、その DLL 内に存在する必要があります。DLL は、呼び出し実行可能ファイルに次のいずれかを渡しても、受け取ってもいけません。
MFC オブジェクトへのポインター
MFC によって割り当てられたメモリへのポインター
上記のいずれかを受け渡す必要がある場合、または呼び出し元の実行可能ファイルと DLL との間で MFC 派生オブジェクトを受け渡す必要がある場合は、MFC 拡張 DLL をビルドする必要があります。
データのコピーを作成する場合のみ、アプリケーションと DLL の間で C ランタイム ライブラリによって割り当てられたメモリへのポインターを渡しても安全です。 これらのポインターは、削除またはサイズ変更しないでください。メモリのコピーを作成せずに使用することもしないでください。
MFC に動的にリンクする標準 MFC DLL をビルドする場合、AFX_MANAGE_STATE マクロを使用して MFC モジュールの状態を正しく切り替える必要があります。 これを行うには、DLL からエクスポートされた関数の先頭に次のコード行を追加します。
AFX_MANAGE_STATE(AfxGetStaticModuleState( ))
MFC に静的にリンクする MFC DLL 内、または MFC 拡張 DLL 内で AFX_MANAGE_STATE マクロを使用することはできません。 詳細については、「MFC モジュールの状態データの管理」を参照してください。
標準 MFC DLL を記述、ビルド、使用する方法の例については、サンプルの DLLScreenCap を参照してください。 MFC に動的にリンクする標準 MFC DLL の詳細については、サンプルの要約にある「Converting DLLScreenCap to Dynamically Link with the MFC DLL」 (MFC DLL に動的にリンクするための DLLScreenCap の変換) というタイトルのセクションを参照してください。