+ -
当前位置:首页 → 问答吧 → 使用了extern "C" 定义的dll导出函数,函数名仍然被加上修饰符,导致动态链接时找不到对应函数

使用了extern "C" 定义的dll导出函数,函数名仍然被加上修饰符,导致动态链接时找不到对应函数

时间:2011-12-01

来源:互联网

HI,
我创建了一个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++的名字改编

作者: agoago_2009   发布时间: 2011-12-01

引用 2 楼 aaadddzxc 的回复:
加个 .def 模块定义文件

++
调用约定也会影响名字改编,最好用.def文件

作者: maoxing63570   发布时间: 2011-12-01

__stdcall convention是下划线+name@参数大小和
影响dll的导出函数名
__cdecl convention的dll的导出函数名才跟代码中一致

作者: wocow3   发布时间: 2011-12-02