视窗操作系统
应用程序接口(
Windows API),有非正式的简称法为WinAPI,是微软对于Windows操作系统中可用的内核
应用程序编程接口的称法。它设计为由C/C++程序调用,而且它也是应用软件与Windows系统最直接的交互方式。
默认情况下,我们的
函数调用都是遵循__stdcall这个规则的。当然,也有诸如__cdecl、__pascal等规则。
2、同时__stdcall规定,被调函数负责栈的回收(调用者只负责压栈). 题外话:__pascal的调用规则是从左到右,正好与__stdcall相反。
3、C调用约定(即用__cdecl
关键字说明)(The C default calling convention)按从右至左的顺序压参数入栈,由调用者把参数弹出栈。对于传送参数的内存栈是由调用者来维护的(正因为如此,实现可变参数vararg的函数(如printf)只能使用该调用约定)当然,这些工作是应用程序自己完成的,不需要编写者动手。汇编语言另当别论(POP SP POP BP等) 。另外,在函数名修饰约定方面也有所不同。 _cdecl是C和C++程序的缺省调用方式。每一个调用它的函数都包含清空
堆栈的代码,所以产生的
可执行文件大小会比调用_stdcall函数的大。函数采用从右到左的压栈方式。VC将函数编译后会在函数名前面加上下划线前缀。
在
函数调用过程中,会使用栈。
__stdcall与__cdecl是两种不同的
函数调用约定,定义了函数参数入栈的顺序,由调用函数还是
被调用函数将参数弹出栈,以及产生函数修饰名的方法。关于这两个调用约定的详细信息,读者可参看MSDN。对于参数个数可变的函数,例如printf,使用的是__cdecl调用约定,Win32的
API函数都遵循__stdcall调用约定。在VC++开发环境中,默认的编译选项是__cdecl,对于那些需要__stdcall调用约定的函数,在声明时必须显式地加上__stdcall。在
Windows程序中,
回调函数必须遵循__stdcall调用约定,所以我们在声明回调函数时要使用CALLBACK。使用CALLBACK而不是
__stdcall的原因是为了告诉我们这是一个回调函数。注意,在Windows 98和Windows 2000下,声明
窗口过程函数时,即使不使用CALLBACK也不会出错,但在Windows NT4.0下,则会出错。