定义一个函数时,在函数名前边带关键字WINAPI和不带的本质区别是什么?

解决方案 »

  1.   

    WINAPI是一个函数的调用约定,也就是标准调用约定,具体论述看这里
    http://dev.csdn.net/article/52/52485.shtm
      

  2.   

     WINAPI是一个宏,它指定函数的调用方式,至于它的最终定义你可以查看头文件。 
    在windef.h中有这样的定义  
      #define   WINAPI             __stdcall  
      不是必须,它只定义一种函数调用的方式
     
     基本上函数调用有四种方式,(注意:任何函数都必须有的,只是你平时一般函数没指定,编译器为你指定一个缺省的  
       
        (1)   __cdecl     一般的c/c++采用此种方式调用函数,调用函数清除栈  
        (2)   __stdcall     一般API采用此咱调用方式,   函数自己清除栈  
        (3)   __fastcall  
        (4)   __pascal       16   bit   API   远程调用   
      

  3.   

    WINAPI指定函数的参数传递规则,从右到左利用栈来传递,函数返回时清栈。如果没指定WINAPI,则按默认的参数传递规则,如果没有修改该编译选项,则按__cdecl方式,从右到左利用栈来传递,调用者清栈。当调用一个有参数的外部函数时,如果函数声明与实际的函数定义不同(一个有WINAPI而另一个没有),则函数返回后栈指针会有错,后果无法预料,通常程序会死掉。