DLL応用編


■説明
これは、DLLが存在した場合は特定のメニューを表示し、DLLが無かった場合はこのメニューを表示させないプログラムです。すなわち、プログラム中の「ある独立した処理」を、現在メニューだけ作っておいて将来この処理を追加する場合や、この処理をオプションにしたりする場合に有効です。
(ポイントはこの色の文字です。)
(1) まず、メインとなるMFCアプリケーションを作成します。(名前は例として"main3"とします。)
[新規作成]でプロジェクトの[MFC AppWizard (exe)]を選択します。
今回の種類は、[SDI]にします。

(2) 次に、「コンソールアプリケーションからMFCのDLLを呼び出す」の項目で作成したDLLのプロジェクトをこのプロジェクトの下にコピーします。(subのディレクトリをmain3の下にコピーします)

(3) main3subを挿入します。
[プロジェクト]の[プロジェクトをワークスペースに挿入]で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のダイアログを呼び出すメニューを追加します。

メニューのIDは、ID_SUB_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)で表示されなかったメニューが表示され、ダイアログが表示されるはずです。
■ファイルのダウンロード
(MFC6.0 プロジェクトファィル 56KB)