__declspec(dllexport) 与 DEF文件以及extern "c"??
__declspec(dllexport) 与 DEF文件以及extern "c"
情形如下:
在DLL中用 __declspec(dllexport)导出函数,比如导出int fun(void);,在EXE程序中通过LoadLibrary()显示调用,用GetProcAddress()函数来获取函数地址,获取失败,通过查看发现DLL中的函数名已经编译为?fun@@YAHXZ,通过测试,用?fun@@YAHXZ来调用GetProcAddress()确实能够获取fun的地址。
后来查询资料知道应该用extern "C" 来指定C链接。加了extern "C"之后,验证通过。
之后,我用DEF文件导出,直接用EXPORTS fun导出函数,并且不加extern "c" 发现在显示调用时也能通过。
但是,MSDN上有这么一句话:使用 .def 文件的主要缺点是:在 C++ 文件中导出函数时,必须将修饰名放到 .def 文件中,或者通过使用外部“C”用标准 C 链接定义导出函数,以避免编译器进行名称修饰。
但是我在用.def文件时并未使用修饰名,而是直接用的fun,而且没有指定C链接,怎么能够执行成功呢?
请高手详细解释一下:__declspec(dllexport) 与 def文件的区别,以及与extern "c" 的关系。
先此谢过!