STDCALL:标准调用,是一个调用函数的方式。对于一般的非DELPHI编写的函数最好用它来调用,否则就可能存在调用问题!

解决方案 »

  1.   

    忘了补充一点: 我用的是全局钩子(dll)
      感谢伴水兄!  10分 
      感谢小麦兄!  20分
      大侠现身啊,帮我解决钩子的问题!
      

  2.   

    stdcall表示为Windows的标准调用;一般用在DLL中(我的理解)
      

  3.   

    stdcall等等是参数入栈的方式!
    stdcall 从右到左,   被调用一方 (Win32标准)
    cdcel   从右到左    调用程序
    safecall 从右到左    被调用一方 
    fast-call 从左到右 使用寄存器(delphi缺省)
    pascal   从左到右   被调用一方(win3.x缺省)Register 调用约定
    在Object Pascal 函数和过程中默认的调用约定是R e g i s t e r 。利用这种方法传递参数可以使代码更加
    优化。因为编译器把头三个3 2 位参数分别用e a x 、e d x 和e c x 寄存器来传递。参看下面声明:
    function Basm(i1,i2,i3:integer):integer;
    可以认为参数I 1 的值被存储在e a x 中,I 2 在e d x 中,I3 在e c x 中。
    再看另一个声明:
    procedure TForm1.Basm(i1,i2:integer);
    这里参数S 1 的值被存储在e a x 中,S 2 在e d x 中,隐含的s e l f 参数被存储在e c x 中。Object/C++调用约定对应关系:
    Object                          Pascal C + +
    r e g i s t e r*                _ _ f a s t c a l l
    p a s c a l                      _ _ p a s c a l
    c d e c l                         _ _ c d e c l*
    s t d c a l l                     _ _ s t d c a l l
    注:有*的表示默认的调用约定。另外,你应该判断键盘消息的类型,例如只要处理KEYUP或者KeyDown即可。这样避免重复处理键盘消息。
      

  4.   

    多谢大虾Kingron,使我茅塞顿开!(40分)
        不过钩子中没有Keyup和Keydown(只有WH_KEYBOARD,没有WH_KEYUP等),怎么办呢?
    请教……
      

  5.   

    给你举一个例子:
    function xx(First,Sec,Third,Fourth:int);stdcall;
    对应的机器代码如下:
    //xx 的代码
    .... ret 10;
    ....
    push Fourth;
    push Third;
    push Sec;
    push First;
    call xx;
    若你的源代码是:
    function xx(First,Sec,Third,Fourth:int);pascal;
    对应的机器代码如下:
    //xx 的代码
    .... ret 10;
    ....
    push First;
    push Sec;
    push Third;
    push Fourth;
    call xx;
    function xx(First,Sec,Third,Fourth:int);cdcel;
    对应的机器代码如下:
    //xx 的代码
    .... ret ;Add esp ,10;
    ....
    push Fourth;
    push Third;
    push Sec;
    push First;
    call xx;
    明白了吗?