__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