参考:

http://www.cnblogs.com/whiteyun/archive/2011/07/22/2113560.html

问题: 如果用了 DEF 文件来导出 DLL 的函数, 还需要在导出的函数声明前面加 extern "C" 吗?

DEMO 下载: http://pan.baidu.com/s/1kTTY6rH

extern "C" 的目的是告诉 C++ 编译器不要对函数名进行改名处理(以便支持函数重载), 而是按照 C 编译器的方式, 不对函数名进行修改.

如果专门有头文件声明函数的话, extern "C" 以及 __declspec(dllexport) 只需要出现在头文件中即可, 定义函数的 .cpp 文件中可有可无.

如果没专门有头文件声明函数的话, extern "C" 以及 __declspec(dllexport) 必须出现在定义函数的 .cpp 文件中.

上述规则对纯 C 项目中的 __declspec(dllexport) 也适用.

做的实验, 思路如下, 即看各种配置下 Hello.h 中需不需要加 extern "C" 从而 UI2.EXE 可以通过 GetProcAddress("fnHello") 找到 Hello.dll 中的 fnHello:

注: Hello 项目中有一个 Hello.h

 UI2.EXE 编译为 C++ 项目 , HELLO.DLL 编译为 C++ 项目, C++ 编译器版本相同, Hello.h 中, 用 __declspec(dllexport) :
Hello.h 有 extern "C", 成功, dumpbin /exports hello.dll 得到 _fnHello
Hello.h 无 extern "C", 失败, dumpbin /exports hello.dll 得到 ?fnHello@@YAXXZ
UI2.EXE 编译为 C++ 项目 , HELLO.DLL 编译为 C++ 项目, C++ 编译器版本相同, Hello.h 中, 无 __declspec(dllexport), 用 DEF 文件:
Hello.h 有 extern "C", 成功, dumpbin /exports hello.dll 得到 _fnHello
Hello.h 无 extern "C", 成功, dumpbin /exports hello.dll 得到 ?fnHello@@YAXXZ
UI2.EXE 编译为 C++ 项目 , HELLO.DLL 编译为 C 项目, Hello.h 中, 用 __declspec(dllexport):
Hello.h 有 extern "C", 成功, dumpbin /exports hello.dll 得到 _fnHello
Hello.h 无 extern "C", 成功, dumpbin /exports hello.dll 得到 _fnHello
UI2.EXE 编译为 C++ 项目 , HELLO.DLL 编译为 C 项目, Hello.h 中, 无 __declspec(dllexport), 用 DEF 文件:
Hello.h 有 extern "C", 成功, dumpbin /exports hello.dll 得到 _fnHello
Hello.h 无 extern "C", 成功, dumpbin /exports hello.dll 得到 _fnHello
UI2.EXE 编译为 C 项目 , HELLO.DLL 编译为 C++ 项目, Hello.h 中, 用 __declspec(dllexport):
Hello.h 有 extern "C", 成功, dumpbin /exports hello.dll 得到 _fnHello
Hello.h 无 extern "C", 失败, dumpbin /exports hello.dll 得到 ?fnHello@@YAXXZ
UI2.EXE 编译为 C 项目 , HELLO.DLL 编译为 C++ 项目, Hello.h 中, 无 __declspec(dllexport), 用 DEF 文件:
Hello.h 有 extern "C", 成功, dumpbin /exports hello.dll 得到 _fnHello
Hello.h 无 extern "C", 成功, dumpbin /exports hello.dll 得到 ?fnHello@@YAXXZ

总结:
当 DLL 是 C++ 实现的时候,
用 DEF 文件, 无 extern "C", 此时 DLL 中导出的函数名仍然会被 C++ 编译器修改, 但仍然可用 GetProcAddress 找到函数.
用 __declspec(dllexport), 如果没有 extern "C", GetProcAddress 找不到函数.

当 DLL 是 C 实现的时候,
因为用的 C 编译器, 所以无论用 DEF 文件还是 __declspec(dllexport), 都不需要 extern "C", DLL 中导出的函数名始终不会被修改.
GetProcAddress 始终能找到函数.

最新文章

  1. 前端渲染利器——JsRender入门
  2. 如何方便的保存WinForm窗体控件的位置大小等等配置信息
  3. Struts2 标签分类
  4. Window下Nexus私服搭建
  5. 11个实用经典的SQL小贴士
  6. SAP CRM 最新简介文字(2007年、中英文)
  7. iOS数据库操作流程
  8. javascript常用内置对象总结(重要)
  9. POI创建Excle
  10. 股票市场问题(The Stock Market Problem)
  11. poj1006---中国剩余定理
  12. ODI中的CDC
  13. 自用windows小软件
  14. Python的原型开发带来的关于Mock的思考
  15. 解决 winform 界面对不齐
  16. ubuntu 14.04安装mysql数据库
  17. Tensorflow图像操作
  18. 牛客网多校赛第七场A--Minimum Cost Perfect Matching【位运算】【规律】
  19. egg.js npm start 启动报错
  20. 2016-2017 National Taiwan University World Final Team Selection Contest A - Hacker Cups and Balls

热门文章

  1. windows服务器。linux服务器的集成包推荐
  2. PHP 面试题数组篇[ 整理中 ]
  3. debug和release转载
  4. 总结一下这几天学习django的心得
  5. ios_常用关键字
  6. php调用empty出现错误Can't use function return value in write context
  7. HTML标签之间不是可以随便嵌套的
  8. laravel 查看SQL语句
  9. 0011 SDK测试方法&ADB语法
  10. NSUserdefaults 简介以及存储自定义数据类型的方法