cdecl?和?stdcall -- 缪缪人生 -- 编程爱好者博客

来源:百度文库 编辑:神马文学网 时间:2024/10/02 21:19:56
__cdecl
__stdcall
C 和 C++ 程序的缺省调用规范
为了使用这种调用规范,需要你明确的加上 __stdcall (或 WINAPI )文字。即 return-type __stdcall function-name[(argument-list)]
在被调用函数 (Callee) 返回后,由调用方 (Caller) 调整堆栈。
1. 调用方的函数调用
2. 被调用函数的执行
3. 被调用函数的结果返回
4. 调用方清除调整堆栈
在被调用函数 (Callee) 返回前,由被调用函数 (Callee) 调整堆栈。图示:
1. 调用方的函数调用
2. 被调用函数的执行
3. 被调用函数清除调整堆栈
4. 被调用函数的结果返回
因为每个调用的地方都需要生成一段调整堆栈的代码,所以最后生成的文件较大。
因为调整堆栈的代码只存在在一个地方(被调用函数的代码内),所以最后生成的文件较小。
函数的参数个数可变(就像 printf 函数一样),因为只有调用者才知道它传给被调用函数几个参数,才能在调用结束时适当地调整堆栈。
函数的参数个数不能是可变的。
对于定义在 C 程序文件中的输出函数,函数名会保持原样,不会被修饰。
对于定义在 C++ 程序文件中的输出函数,函数名会被修饰, MSDN 说 Underscore character (_) is prefixed to names . 我实际测试( VC4 和 VC6 )下来发现好像不是那么简单。
可通过在前面加上 extern “C” 以去除函数名修饰。也可通过 .def 文件去除函数名修饰。
不论是 C 程序文件中的输出函数还是 C++ 程序文件中的输出函数,函数名都会被修饰。
对于定义在 C 程序文件中的输出函数, An underscore (_) is prefixed to the name. The name is followed by the at sign (@) followed by the number of bytes (in decimal) in the argument list.
对于定义在 C++ 程序文件中的输出函数,好像更复杂,和 __cdecl 的情况类似。
好像只能通过 .def 文件去除函数名修饰。
_beginthread 需要 __cdecl 的线程函数地址
_beginthreadex 和 CreateThread 需要 __stdcall 的线程函数地址
两者的参数传递顺序都是从右向左。
为了让 VB 可以调用,需要用 __stdcall 调用规范来定义 C/C++ 函数。请参看Microsoft KB153586 文章:How To Call C Functions That Use the _cdecl Calling Convention。
当你 LoadLibrary 一个 DLL 文件后, 把 GetProcAddress 取得的函数地址传给上面三个线程生成函数时,请务必确认实际定义在 DLL 文件的输出函数符合调用规范要求。否则,编译成 Release 版后运行,可能会破坏堆栈,程序行为不可预测。
VC 中的相关编译开关:/Gd /Gr /Gz。另外,VC6中新增加的 /GZ 编译开关可以帮你检查堆栈问题。
我也是初学者,若有不对的地方、可以补充的地方,请指教。谢谢。
cdecl?和?stdcall -- 缪缪人生 -- 编程爱好者博客 NAND和NOR?flash详解 -- 清钟沁桐 -- 编程爱好者博客 我所理解的拷贝构造函数和赋值函数 -- 业余空间 -- 编程爱好者博客 编程爱好者 成为编程高手的二十二条军规 -- 编程历程 -- 编程爱好者博客 公历历法::星期算法 -- 算法驿站 -- 编程爱好者博客 C语言32个关键字解释 -- love_you_forever -- 编程爱好者博客 VC中Combo?Box控件使用大全 -- 程序之巢2008 -- 编程爱好者博客 [062]?杨辉三角的多种解法 -- 一步一脚印 -- 编程爱好者博客 [059]?C语言中动态分配数组(一维) -- 一步一脚印 -- 编程爱好者博客 [065]?赋值运算中的类型转换 -- 一步一脚印 -- 编程爱好者博客 CListCtrl第一列不能居中的问题 -- 雨切星&贝壳里的海 -- 编程爱好者博客 如何为自己的网站制作RSS输出? -- Under?The?Sea -- 编程爱好者博客 关于CString -- OnlyC -- 编程爱好者BLOG Curses初学者编程指南 - Unix爱好者家园 编程规范和范例 编程规范和范例 手把手教你禁止端口 编程爱好者BLOG C语言 文件操作 -转载自编程爱好者论坛 qq个性经典网名:岜廢話, 寫旳佷唯羙≈ - 网名爱好者 - 骑猪追车 - 和讯博客 浅谈HOOK技术在VC编程中的应用—编程爱好者网站 programfan.com Inblogit—介于托管和独立博客之间的Blogging方式?-非寒编程网 ICE和ACE-高效的网络编程中间平台简介--hustlg的博客 献给咖啡和茶艺爱好者