或者说回调函数为什么一定要用_stdcall这种调用,随便声明一个函数作为回调函数不可以吗

解决方案 »

  1.   

    沒說一定要這樣 你自定義一個別的調用協議的也可以 比如void caller(void (_cdecl* p)())
    {
    p();
    }void _cdecl proc()
    {
    }caller(proc);只是回調函數預先指定原型了 你就一定要按照這個原型來穿參數
      

  2.   

    各种语言调用函数有参数从左至右入栈和从右至左入栈的区别,_stdcall这是约定的,需要这种类型,你写自己的程序可以不必遵守,但是如果是写HOOK等把自己的函数替换进其他语言写的程序就要遵守这种约定了。
      

  3.   

    stdcall是很多编译器支持的调用方式(不然还叫std),你用其他调用约定可能会在其它编译器或者语言上无法实现而已,说白了就是为了你写的东西可以给更多的人用(他们有的用VB,有的用Delphi,有的用.NET)
      

  4.   

    CALLBACK 会在exe文件头存放函数名和地址
      

  5.   

    __stdcall  是为不同语言准备的,如果只用同一种语言,你大可不用考虑。但是为了兼容其他语言产生的代码,所以强制使用__stdcall方式,具体的你可以在MSDN中查询"Argument   Passing   and   Naming   Conventions"
      

  6.   

    声明为__stdcall 是操作系统的要求。回调函数一般由操作系统调用,因此其声明格式必须满足操作系统的要求。