__stdcall的理解与作用
2015-08-23 21:42
766 查看
在做一个系统集成的项目中,遇到typedef int(__stdcall *Func_*****_System_Version)();这样的声明,第一次接触_stacall,故整理如下:
转载:/article/2006924.html
并不是所有的语言都支持_cdcel调用规则,但是都支持_sdtcall调用规则, 假如你用VC做了一个DLL,导出了某些函数,如果你想这个DLL被其他语言也能调用的话,VB.DEPHI.PB..你的把他的调用约定声明为__stdcallwindows api都是_stdcall调用规则,
函数调用约定确定一个程序如何实现一个函数调用及参数如何传递。在单一语言程序中,调用约定几乎总是正确的,这是因为对所有模块总有一个缺省的约定并且头文件会负责调用和被调用程序之间的一致性。在一个混合语言程序中,不同的语言不可能分享同一个头文件。由于调用约定而产生的错误在编译时无法发现,直到程序在运行时(run-time)实现函数调用时才出现并会立即导致应用程序崩溃。
关键字 栈的维护者 参数传递
__cdecl 调用者 参数反序入栈(右-> 左)
__stdcall 被调用者 参数反序入栈(右-> 左)
__fastcall 被调用者 参数先存寄存器,接着入栈
thiscall(并非关键字) 被调用者 参数入栈,this指针存ECX
在C++中,可以在函数声明或定义时用关键字__stdcall指定调用约定。__stdcall调用约定经常在Windows程序或API函数中使用。在GUI程序中,PASCAL、WINAPI和CALLBACK都被定义为__stdcall。C语言的缺省调用约定为__cdecl。
__stdcall产生的名字修饰是将名字符号前加下划线(_),并且后加”@”和函数参数字节数(所需栈空间)
转载:/article/2006924.html
并不是所有的语言都支持_cdcel调用规则,但是都支持_sdtcall调用规则, 假如你用VC做了一个DLL,导出了某些函数,如果你想这个DLL被其他语言也能调用的话,VB.DEPHI.PB..你的把他的调用约定声明为__stdcallwindows api都是_stdcall调用规则,
函数调用约定确定一个程序如何实现一个函数调用及参数如何传递。在单一语言程序中,调用约定几乎总是正确的,这是因为对所有模块总有一个缺省的约定并且头文件会负责调用和被调用程序之间的一致性。在一个混合语言程序中,不同的语言不可能分享同一个头文件。由于调用约定而产生的错误在编译时无法发现,直到程序在运行时(run-time)实现函数调用时才出现并会立即导致应用程序崩溃。
关键字 栈的维护者 参数传递
__cdecl 调用者 参数反序入栈(右-> 左)
__stdcall 被调用者 参数反序入栈(右-> 左)
__fastcall 被调用者 参数先存寄存器,接着入栈
thiscall(并非关键字) 被调用者 参数入栈,this指针存ECX
在C++中,可以在函数声明或定义时用关键字__stdcall指定调用约定。__stdcall调用约定经常在Windows程序或API函数中使用。在GUI程序中,PASCAL、WINAPI和CALLBACK都被定义为__stdcall。C语言的缺省调用约定为__cdecl。
__stdcall产生的名字修饰是将名字符号前加下划线(_),并且后加”@”和函数参数字节数(所需栈空间)
相关文章推荐
- 2013 ACM/ICPC Asia Regional Chengdu Online
- Reverse Nodes in k-Group
- hdu2852--KiKi's K-Number(段树,求第一k的数量)
- ssdt与shadowssdt区别
- 安装与配置windbg的symbol(符号)
- 【机器学习系列】机器学习界大牛林达华推荐的书籍
- Visual Studio 2015 密钥
- 32 bit hardware buffers are not allowed in OpenGL ES
- ictclas分词系统的使用,java调用,附带连接mysql进行读写。
- iOS中使用RegexKitLite来试用正则表达式 使用ARC 20个错误解决办法
- 每天一个Linux命令-22(关闭防火墙)
- 使用supervisord管理python进程
- 基于对话框的应用程序,点击按钮打开一个网页
- c & c++中const
- 枚举实现工厂模式
- IAT和JMP方式的HOOK
- win7下用windbg进行本地内核调试
- UITextField的总结
- seaside
- ARM处理器比较:A8/A9