为什么微软的__stdcall函数不乱名?

人到中年琐事多 2010-02-04 10:54:43
以下面这个函数为例:
extern "C" __declspec(dllexport) void DisplayD(int x)
{
std::cout<<x;
}

这样编译出来的DLL,用dumpbin /exports查看,函数名没有乱,正常

改成这样:
__declspec(dllexport) void DisplayD(int x),
函数名就乱了,虽然在导入模块的时候照着那个乱乱的函数名可以成功调用,但是这样很不爽

再改成这样,加一个__stdcall修饰符:
extern "C" __declspec(dllexport) void __stdcall DisplayD(int x)
函数名也乱了,说明__stdcall的优先级比extern "C要高啊,盖掉了extern "C"

我想问的是,为什么那些WINAPI的函数没有乱码,没有看到有DEF文件,是不是因为它们都是用C写的缘故?
在C里编译是不会有函数名乱乱的现象的是吗?
如果我拿到一个DLL,全是乱乱的函数名,难道我也只有被迫用乱乱的函数名了吗?有没有其它办法能够使用好好的名?
...全文
257 18 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 yinshisike 的回复:]
引用 10 楼 yangglemu 的回复:
老大们: WINAPI 的__stdcall 为什么不乱名?
谢谢

7楼的链接内容已经说明这个问题了.在最后面的*.DEF文件那块.
[/Quote]

WINAPI没有DEF文件的,而且都是__stdcall的,它怎么不乱乱的名?
yinshisike 2010-02-05
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 yangglemu 的回复:]
老大们: WINAPI 的__stdcall 为什么不乱名?
谢谢
[/Quote]
7楼的链接内容已经说明这个问题了.在最后面的*.DEF文件那块.
  • 打赏
  • 举报
回复
谢谢各位,我理解了,一个模模糊糊的东西终于清晰了
Waiting4you 2010-02-05
  • 打赏
  • 举报
回复
是的,WINAPI是用了DEF的。
http://www.cppprog.com/2009/0918/163.html
  • 打赏
  • 举报
回复
楼上两位大侠
你们的意思就是WINAPI使用了DEF?
如果真是这样,我以后也使用DEF了,确定吗?
magic7004 2010-02-05
  • 打赏
  • 举报
回复
搂住你怎么知道WINAPI编译的时候么有def文件呢?真是奇怪了。
stjay 2010-02-05
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 yangglemu 的回复:]
引用 11 楼 yinshisike 的回复:
引用 10 楼 yangglemu 的回复:
老大们: WINAPI 的__stdcall 为什么不乱名?
谢谢

7楼的链接内容已经说明这个问题了.在最后面的*.DEF文件那块.


WINAPI没有DEF文件的,而且都是__stdcall的,它怎么不乱乱的名?
[/Quote]

def文件总不能随windows一起发布吧,你是怎知没def?
况且调用API不需要def文件
djlxue 2010-02-05
  • 打赏
  • 举报
回复
mark
  • 打赏
  • 举报
回复
老大们: WINAPI 的__stdcall 为什么不乱名?
谢谢
dd_zhouqian 2010-02-04
  • 打赏
  • 举报
回复
调用约定不一样吧
cdecl会乱名吧
xsc2001 2010-02-04
  • 打赏
  • 举报
回复
1. _cdecl是c和c++的调用方式,由调用者来清理现场。
2. _stdcall是标准调用方式,有被调用者来清理现场。
3._cdecl是c\c++编译器(VC)的默认方式,在c\c++编译器(VC)中,加于不加_cdecl效果一样。
4. extern "c"是防止名字改变的,只适用于_cdecl调用方式,对_stdcall调用无效
xsc2001 2010-02-04
  • 打赏
  • 举报
回复
这个只不过是一种函数调用约定而已。调用一个函数时,总是先把参数压入栈,然后通过call指令转移到被调用函数,在完成调用后清除堆栈.这里有两个问题:(1)哪个参数先入栈(2)由谁来清理堆栈.这两个方面的问题称为"调用约定(Calling Conventions)"问题。_stdcall是Windows API函数常用的调用约定,_cdecl是C调用约定.__declspec仅仅是为了规定数据对齐方式。
sjdev 2010-02-04
  • 打赏
  • 举报
回复
名字修饰因调用约定而不同。

[Quote=引用楼主 yangglemu 的回复:]
如果我拿到一个DLL,全是乱乱的函数名,难道我也只有被迫用乱乱的函数名了吗?有没有其它办法能够使用好好的名?
[/Quote]

使用导入库吧。
onlyliu 2010-02-04
  • 打赏
  • 举报
回复
http://blog.csdn.net/cmiaomiaozoo/archive/2009/11/11/4798994.aspx
这里写得还比较清楚
Tr1j5n 2010-02-04
  • 打赏
  • 举报
回复
编译风格
sjdev 2010-02-04
  • 打赏
  • 举报
回复
[Quote=引用楼主 yangglemu 的回复:]
我想问的是,为什么那些WINAPI的函数没有乱码,没有看到有DEF文件,是不是因为它们都是用C写的缘故?
[/Quote]

Win32 API通常是_stdcall也即pascal调用约定。
fox000002 2010-02-04
  • 打赏
  • 举报
回复
首先 C 导出的函数名与函数调用约定有关


__cdecl _函数名

__stdcall _函数名@数字

__fastcall @函数名@数字


extern "C" 的话就不使用 C++ name mangling

如果 DLL 导出的名称是乱的,一般是用 implib 进行隐式调用的

15,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧