| ■説明 |
| これは、DLLが存在した場合は特定のメニューを表示し、DLLが無かった場合はこのメニューを表示させないプログラムです。すなわち、プログラム中の「ある独立した処理」を、現在メニューだけ作っておいて将来この処理を追加する場合や、この処理をオプションにしたりする場合に有効です。 (ポイントはこの色の文字です。) |
| (1) まず、メインとなるMFCアプリケーションを作成します。(名前は例として"main3"とします。) [新規作成]でプロジェクトの[MFC AppWizard (exe)]を選択します。 今回の種類は、[SDI]にします。 (2) 次に、「コンソールアプリケーションからMFCのDLLを呼び出す」の項目で作成したDLLのプロジェクトをこのプロジェクトの下にコピーします。(subのディレクトリをmain3の下にコピーします) (3) main3にsubを挿入します。 [プロジェクト]の[プロジェクトをワークスペースに挿入]でsubプロジェクトを選択します。subがアクティブプロジェクトになるので、main2をアクティブプロジェクトに戻します。 (4) MainFrm.cppの上部に(CMainFrameのコメントの上)に以下のコードを追加します。 typedef __declspec(dllimport) void (__cdecl* _display_dialog)(); static HINSTANCE hDLL = NULL; static _display_dialog display_dialog; (5) コンストラクタ(CMainFrame)に以下のコードを追加します。 hDLL = LoadLibrary("sub.dll"); if ( hDLL) { display_dialog = (_display_dialog)GetProcAddress( hDLL, "display_dialog"); } これにより、明示的にDLLを読込み、関数の名前からそのアドレスを取出します。 hDLLがNULLの場合は、追加する処理を呼び出さない事(オプション)になります。 (6) main3の編集メニューにDLLのダイアログを呼び出すメニューを追加します。 ![]() (7) クラスウィザードでCMainFrameにID_SUB_DLLの処理を追加します。 変更しないとOnSubDll関数ができます。 この中にDLLのダイアログを表示する処理を追加します。 void CMainFrame::OnSubDll() { if ( hDLL) display_dialog(); } (8) この項のテーマのメニューの操作を追加します。 CMainFrameのOnCreateの最後(returnの前)に以下の処理を追加します。 CMenu* pMenu; pMenu = GetMenu(); if ( !hDLL) pMenu->RemoveMenu( ID_SUB_DLL, MF_BYCOMMAND); (9) デストラクタ(~CMainFrame)に以下の処理を追加し、DLLを破棄します。 if ( hDLL) FreeLibrary(hDLL); (10) main3をビルドします まず、このまま実行してみて下さい。追加したメニューが表示されないはずです。 (ダウンロードした方は、(12)の後で作業ディレクトリを消してから実行してみて下さい。) (11) DLLを読み込むために[プロジェクト]の[設定]の[デバッガ]の[作業用のディレクトリ]を.\sub\debugにします。 (12) main3を実行してみてください。 (10)で表示されなかったメニューが表示され、ダイアログが表示されるはずです。 |
| ■ファイルのダウンロード |