__stdcall与__cdecl的区别
来源:互联网 发布:avast淘宝激活 编辑:程序博客网 时间:2024/06/05 07:10
在调用DLL里的函数或类成员函数时碰到此错误:
Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call. This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention.问题出在函数定义的调用规则,和实际的调用规则不同。如编译器默认的是__cdecl,而__stdcall 类型的函数却用了 __cdecl 的调用规则,由于编译时不会报错,结果出现了运行时异常。所以把在函数定义中进行设置调用规则即可解决此问题。如:typedef void (__stdcall Func)(int a);
_stdcall与_cdecl的区别
1、_stdcall是Pascal程序的缺省调用方式,通常用于Win32 Api中,函数采用从右到左的压栈方式,自己在退出时清空堆栈。VC将函数编译后会在函数名前面加上下划线前缀,在函数名后加上"@"和参数的字节数。 int f(void *p) -->> _f@4(在外部汇编语言里可以用这个名字引用这个函数)2、C调用约定(即用__cdecl关键字说明)(The C default calling convention)按从右至左的顺序压参数入栈,由调用者把参数弹出栈。对于传送参数的内存栈是由调用者来维护的(正因为如此,实现可变参数 vararg的函数(如printf)只能使用该调用约定)。另外,在函数名修饰约定方面也有所不同。 _cdecl是C和C++程序的缺省调用方式。每一个调用它的函数都包含清空堆栈的代码,所以产生的可执行文件大小会比调用_stdcall函数的大。函数采用从右到左的压栈方式。VC将函数编译后会在函数名前面加上下划线前缀。来源:- http://www.cnblogs.com/coderzh/archive/2008/12/01/1345053.html
- http://blog.csdn.net/kongbu0622/article/details/5999965
1 0
- __stdcall与__cdecl的区别
- __stdcall与__cdecl的区别
- __stdcall与__cdecl的区别
- __stdcall与__cdecl的区别
- __stdcall与__cdecl的区别
- __stdcall与__cdecl的区别
- __stdcall 与 __cdecl 区别
- __stdcall 与 __cdecl 区别
- __stdcall __cdecl的区别
- __stdcall __cdecl的区别
- __stdcall __cdecl的区别
- __cdecl __fastcall与 __stdcall的区别
- __stdcall、__cdecl与__fastcall的区别
- __stdcall、__cdecl与__fastcall的区别
- __cdecl __fastcall与 __stdcall的区别
- WINBASEAPI 与WINAPI(__stdcall __cdecl)的区别
- __cdecl __fastcall与 __stdcall区别
- __cdecl __fastcall与 __stdcall区别
- 添加和处理动作(Adding and Handling Actions)
- (MFC)任务对话框CTaskDialog类
- android中的color文件
- MVC和MVP的梳理
- hbase0.98.9 Export工具使用
- __stdcall与__cdecl的区别
- ERROR: Cannot determine the location of the VS Common Tools folder.
- Java千百问_05面向对象(006)_is-a,has-a,like-a是什么
- 51Nod-1027-大数乘法
- xmpp开发IM即时通讯系列(二)--即时通讯服务器搭建(1)数据库搭建
- POJ 2186 Tarjan
- hiho 31 扫雷二
- VS用C语言连接SQL Server解决办法
- ListView