dll:
extern "C"
{
__declspec(dllexport) void PrintVector(const vector<int> v)
{
copy(v.begin(), v.end(), ostream_iterator<int>(cout, " "));
}
}
exe:
typedef void (* FUNC)(const vector<int>);
int main()
{
HMODULE hModule = LoadLibrary("VectorDll.dll");
if (hModule)
{
FUNC fun = (FUNC)GetProcAddress(hModule, "PrintVector");
vector<int> v(10, 1);
fun(v);
}
return 0;
}
上面代码存在严重的问题,运行时会崩溃:
在windows核心编程中明确的说了在dll中如果申请了内存空间,就一定要在dll中释放这块内存空间。
在exe和dll都静态链接到C/C++运行时库的时候,exe和dll都有各自的堆(heap)空间,所以各自申请的内存需要各自释放。
上面代码将参数改成 const vector<int> & 就可以正常运行。
但是如果exe中的vector版本和dll中vector的版本不同,问题又会出现,并且这些是未知的问题。
所以在dll函数接口中尽量使用基本数据类型。
关于exe和dll内存分配:
http://www.codeguru.com/forum/showthread.php?t=229394
http://www.gamedev.net/community/forums/topic.asp?topic_id=289896
http://blog.csdn.net/dotphoenix/archive/2009/07/14/4348686.aspx
http://blog.sina.com.cn/s/blog_60d705b10100g4ou.html
http://hi.baidu.com/honey%BC%A6/blog/item/8780d1f918976ed5b58f310f.html
关于dll和template/STL:
http://support.microsoft.com/default.aspx?scid=KB;en-us;q172396
http://support.microsoft.com/default.aspx?scid=KB;en-us;q168958
http://www.hellocpp.net/Articles/Article/714.aspx