使用了extern "C" 定义的dll导出函数,函数名仍然被加上修饰符,导致动态链接时找不到对应函数
时间:2011-12-01
来源:互联网
HI,
我创建了一个dll,定义了下面这样的一个函数
C/C++ code
然后在调用者中通过LoadLibrary动态加载dll,在查找函数的时候,通过GetProcAddress(hinst,"MyFunc")查找,总是找不到。
通过dumpbin dll,发现导出函数名被修饰了,变为如下:
ordinal hint RVA name
1 0 000110C8 _MyFunc@0 = @ILT+195(_MyFunc@0)
1.如果是按照教程上说的,extern "C"不是限定符号编译时不加修饰符么?
2.如果去掉__stdcall,则extern "C"确实是不加修饰符的。
这么说,__stdcall和extern "C"不能共存的么?
我看到别人提供的dll,对应的头文件函数说明也是标明是stdcall,同时我们在访问函数的时候,也是正常使用MyFunc,并没有其他的修饰符,请问这个是怎么做到的呀?
我创建了一个dll,定义了下面这样的一个函数
C/C++ code
extern "C" int __declspec(dllexport) __stdcall MyFunc()
然后在调用者中通过LoadLibrary动态加载dll,在查找函数的时候,通过GetProcAddress(hinst,"MyFunc")查找,总是找不到。
通过dumpbin dll,发现导出函数名被修饰了,变为如下:
ordinal hint RVA name
1 0 000110C8 _MyFunc@0 = @ILT+195(_MyFunc@0)
1.如果是按照教程上说的,extern "C"不是限定符号编译时不加修饰符么?
2.如果去掉__stdcall,则extern "C"确实是不加修饰符的。
这么说,__stdcall和extern "C"不能共存的么?
我看到别人提供的dll,对应的头文件函数说明也是标明是stdcall,同时我们在访问函数的时候,也是正常使用MyFunc,并没有其他的修饰符,请问这个是怎么做到的呀?
作者: zerotodream 发布时间: 2011-12-01
Help~~~~~~~~~~~~~~~~~~~~~~~
作者: zerotodream 发布时间: 2011-12-01
加个 .def 模块定义文件
作者: aaadddzxc 发布时间: 2011-12-01
c默认是__cdecl 调用约定;
API函数都是 __stdcall 调用约定;
不同的调用约定对于怎么入栈,有谁平衡堆栈都不一样;
extern "C" 可以防止C++的名字改编
API函数都是 __stdcall 调用约定;
不同的调用约定对于怎么入栈,有谁平衡堆栈都不一样;
extern "C" 可以防止C++的名字改编
作者: agoago_2009 发布时间: 2011-12-01
引用 2 楼 aaadddzxc 的回复:
加个 .def 模块定义文件
加个 .def 模块定义文件
++
调用约定也会影响名字改编,最好用.def文件
作者: maoxing63570 发布时间: 2011-12-01
__stdcall convention是下划线+name@参数大小和
影响dll的导出函数名
__cdecl convention的dll的导出函数名才跟代码中一致
影响dll的导出函数名
__cdecl convention的dll的导出函数名才跟代码中一致
作者: wocow3 发布时间: 2011-12-02
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28