Microsoft Visual C++ 2010 Express EditionでExcelから呼び出せるDLLを作る

すぐ忘れそうなので超丁寧にメモ。
VC++を起動後、「ファイル」→「新規作成」→「プロジェクト」と選択

「Win32 プロジェクト」を選択して適当に名前を付けて保存。ここでは名前、ソリューション名共に”dll_vba”とした。

「次へ」を押下して、「DLL」を選択して「空のプロジェクト」にはチェックを入れて完了を押下。
「空のプロジェクト」を入れないと余計なもんがゴチャゴチャ入ってくる。

ソースファイル&ヘッダーファイルを追加する。それぞれファイル名はmain.cppとmain.hとした。


次にDLLの関数として外から呼び出し可能な物一覧を書いておくdefファイルを作成したいのだけれどもVC++2010では該当する項目がなかった。
しょうがないので、cppファイルを選んで保存する時にファイル名の拡張子を.defにしておいた。

あとは、それぞれのファイルに以下のようなコードを書いた。
とりあえず足し算関数を定義。呼び出し規約は__stdcallを使わないとだめっぽい。
main.cpp

#include <windows.h>
#include "main.h"
double __stdcall Add(double x,double y)
{
	return(x+y);
}
BOOL APIENTRY DllMain(HMODULE hModule,DWORD ul_reason_for_call,LPVOID lpReserved)
{
	return TRUE;
}

main.h

#ifndef __main_h__
#define __main_h__
//Export用関数
double __stdcall Add(double x,double y);
#endif

dll_vba.def

LIBRARY	"dll_vba"
EXPORTS
	Add

次に、モジュール定義ファイルをリンカがちゃんと見てくれるよう「プロジェクト」を右クリック→「プロパティ」で辿り着いた先で以下の画面のように設定。

あとはコンパイルさせればOK。
うまくコンパイルできていると「$プロジェクト保存フォルダ$\dll_vba\Debug」にdllができている。
同フォルダに適当なExcelファイル(私のバージョンは2007)を作成して標準モジュールに以下のように記述。
画面にはボタンを一個置いておいて、そのボタンを押下したらマクロが実行されるようにしてる。

'DLLから呼び出して関数を宣言しておく。
Private Declare Function Add Lib "dll_vba.dll" _
    (ByVal x As Double, ByVal y As Double) As Double
Sub ボタン1_Click()
    'カレントディレクトリをこのフォルダに
    ChDir ThisWorkbook.Path
    'DLLで計算させた結果を画面に表示
    MsgBox Add(3, 5)
End Sub

もちろんディレクトリの変更は一回でいいんで本来auto_open関数に書くべき、今回は1ファイルで全部済ませたかったのでこうしてる。
で、実行すると

こんな感じでちゃんと3と5を足した結果が返ってくる。
ソリューションファイル+Excelファイルはここ(zip)に置いておくのでご自由にどぞ〜。
(無保証・やたらでかい一時ファイルのようなものは削除済)

【参考にしたサイト】
VC++.NETで外部DLLの作り方
Excelのアドイン関数を.dllに書いてみる
DLL作成方法・呼出方法