我们在VC中使用一些API函数时, windows采用的是__stdcall的调用方式
而我们自己写的函数默认是__cdecl的调用方式那为什么在我们写的函数中调用API函数不会报错呢?上次发帖没有得到很好的答复,现在重发!

解决方案 »

  1.   

    调用约定~
          1、__stdcall调用约定相当于16位动态库中经常使用的PASCAL调用约定。在32位的VC++5.0中PASCAL调用约定不再被支持(实际上它已被定义为__stdcall。除了__pascal外,__fortran和__syscall也不被支持),取而代之的是__stdcall调用约定。两者实质上是一致的,即函数的参数自右向左通过栈传递,被调用的函数在返回前清理传送参数的内存栈,但不同的是函数名的修饰部分(关于函数名的修饰部分在后面将详细说明)。VC将函数编译后会在函数名前面加上下划线前缀,在函数名后加上"@"和参数的字节数。        2、C调用约定(即用__cdecl关键字说明)按从右至左的顺序压参数入栈,由调用者把参数弹出栈。对于传送参数的内存栈是由调用者来维护的(正因为如此,实现可变参数的函数只能使用该调用约定)。另外,在函数名修饰约定方面也有所不同。每一个调用它的函数都包含清空堆栈的代码,所以产生的可执行文件大小会比调用__stdcall函数的大。函数采用从右到左的压栈方式。VC将函数编译后会在函数名前面加上下划线前缀。是C、C++和MFC程序的缺省调用方式。 
      

  2.   

    在头文件中,已经对各个api指定了调用约定方式了,所以不会出错,如果采用显式加载dll的方式调用api,如果没有指定调用约定的方式,则就可能会出错