ライブラリ無しでDLLを呼び出す

■説明
これは、メインとなるアプリケーションからライブラリをリンクすること無くDLLを呼び出すプログラムです。このメリットは、VCのヘルプにも記してありますが、実行時にライブラリが無い場合でもその後の実行を続けることが可能となります。通常のライブラリを使ったリンクをすると実行時にDLLが存在しないとそこでアプリケーションは終了してしまいます。以下に、作成の手順とポイントを説明します。
ポイントはこの色の文字です。)
(1) まず、メインとなるMFCアプリケーションを作成します。(名前は例として"main2"とします。)
[新規作成]でプロジェクトの[MFC AppWizard (exe)]を選択します。
今回の種類は、[ダイアログベース]にします。

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

(3) main2subを挿入します。
[プロジェクト]の[プロジェクトをワークスペースに挿入]でsubプロジェクトを選択します。subがアクティブプロジェクトになるので、main2をアクティブプロジェクトに戻します。

(4) main2dlg.cppの上部に(CAboutDlgの上)に以下のコードを追加します。

typedef __declspec(dllimport) void (__cdecl* _display_dialog)();

static HINSTANCE hDLL = NULL;

static _display_dialog display_dialog;

(5) コンストラクタ(CMain2Dlg)の最後に以下のコードを追加します。

hDLL = LoadLibrary("sub.dll");

if ( hDLL)
{
display_dialog = (_display_dialog)GetProcAddress( hDLL, "display_dialog");
}
これにより、明示的にDLLを読込み、関数の名前からそのアドレスを取出します。

(6) OKボタンの処理を追加し、ここでDLLの関数を呼び出します。

void CMain2Dlg::OnOK()
{
if ( hDLL)
display_dialog();
}

(7) デストラクタを追加し、ここでDLLを破棄します。

CMain2Dlg::~CMain2Dlg()

{
if ( hDLL)
FreeLibrary(hDLL);
}

(8) main2をビルドします

(9) DLLを読み込むために[プロジェクト]の[設定]の[デバッガ]の[作業用のディレクトリ]を.\sub\debugにします。

(10) main2を実行してみてください。
■ファイルのダウンロード
(MFC6.0 プロジェクトファィル 44KB)