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即可。这样避免重复处理键盘消息。
感谢伴水兄! 10分
感谢小麦兄! 20分
大侠现身啊,帮我解决钩子的问题!
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即可。这样避免重复处理键盘消息。
不过钩子中没有Keyup和Keydown(只有WH_KEYBOARD,没有WH_KEYUP等),怎么办呢?
请教……
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;
明白了吗?