传统的导出 DLL 函数的方法是使用模块定义文件 (.def),Visual C++ 提供了更简洁方便的方法,即 “__declspec(dllexport)” 关键字,例如:
1 |
__declspec(dllexport) int __stdcall MyExportFunction(int iTest); |
但是通过查看工具我们可以发现,DLL 导出的函数名字实际上是 _MyExportFunction@4。还好,VC 提供了一个预处理指示符 “#pragma” 来指定链接选项,可以通过它达到我们的目的,如下:
1 |
#pragma comment(linker, "/EXPORT:MyExportFunction=_MyExportFunction@4") |
这样再看,就会发现导出的函数名字已经成为了想要的 MyExportFunction。
更新 1(2005-01-31 14:51):TNND,上面这种方法竟然是两个符号一起导出,可恶!
更新 2(2005-09-17 11:16):终于知道了,应该把函数前面的 __declspec() 修饰去掉,也就是说,只需要第二条 pragma 指令即可。而且还可以使如下形式:
1 |
#pragma comment(linker, "/EXPORT:MyExportFunction=_MyExportFunction@4,PRIVATE") |
PRIVATE 的作用与其在 def 文件中的作用一样。
永久链接
去掉__stdcall和pragma只用__declspec(dllexport) int MyExportFunction(int iTest);就可以了,__stdcall没必要
永久链接
__stdcall 是必要的。你可以尝试写个 DLL,导出函数不写 __stdcall 让 VB 之类的别的语言调用一下看会发生什么。