名前のマングリングと呼び出し規約に注意する必要があります。
したがって、DLL では次のようになります。
// mydll.h
#pragma comment(linker, "/EXPORT:fnmydll=_fnmydll@4")
extern "C" int WINAPI fnmydll(int value);
// mydll.cpp
#include "mydll.h"
extern "C" int WINAPI fnmydll(int value)
{
return value;
}
次に、DLL クライアント アプリケーションで次のようにします。
#include <windows.h>
#include <boost/function.hpp>
#include <iostream>
int main()
{
HMODULE dll = ::LoadLibrary(L"mydll.dll");
typedef int (WINAPI *fnmydll)(int);
// example using conventional function pointer
fnmydll f1 = (fnmydll)::GetProcAddress(dll, "fnmydll");
std::cout << "fnmydll says: " << f1(3) << std::endl;
// example using Boost.Function
boost::function<int (int)> f2 = (fnmydll)::GetProcAddress(dll, "fnmydll");
std::cout << "fnmydll says: " << f2(7) << std::endl;
return 0;
}
この例がうまくビルドされ、実行されると確信しています。