C++ で dll を動的にロードする必要があります。
このチュートリアルhttp://msdn.microsoft.com/en-us/library/ms235636.aspxに従ってdll を作成すると、すべて正常に機能しました。
次に、このhttp://msdn.microsoft.com/en-us/library/64tkc9y5.aspxに従い、コンソール アプリケーションを次のように調整しました。
typedef DOUBLE(CALLBACK* DllFunc)(DOUBLE, DOUBLE);
int _tmain(int argc, _TCHAR* argv[])
{
HINSTANCE hDLL; // Handle to DLL
DllFunc dllFunc1;
DOUBLE p1 = 1.0, p2 = 2.0, r;
hDLL = LoadLibrary(L"MathFuncsDLL");
if (hDLL != NULL)
{
cout << "DLL loaded: " << hDLL << endl;
dllFunc1 = (DllFunc)GetProcAddress(hDLL, "MyMathFuncs@MathFuncs@Multiply");
if (!dllFunc1)
{
// handle the error
FreeLibrary(hDLL);
cout << "Function not found!" << endl;
return -1;
}
else
{
// call the function
r = dllFunc1(p1, p2);
cout << "The result is: " << r << endl;
}
}
else {
cout << "Dll not found" << endl;
return -1;
}
cout << "Press any key to exit." << endl;
int i;
cin >> i;
return 0;
}
DLL は正しく読み込まれ、null ではありません。問題は、常に 0 を返す GetProcAddress() 関数です。
名前空間、クラス名、メソッド名のすべての組み合わせを試しました。関数名の @ の代わりにスコープ演算子 (::) を使用しようとしました。
名前空間全体を extern "C" として定義しようとしましたが、何も変わりません。コンソール アプリケーションを実行またはデバッグするたびに、「乗算」機能が見つかりません。
私は何かが足りないと思います...どこが間違っていますか?
編集
Dependency Walker により、次のエクスポート テーブルが公開されました。
ここで、関数名の最後の部分が何を意味するのだろうか... __declspec(dllexports) がこれらのシンボルを追加するのはなぜですか?