W
wp231957
Unregistered / Unconfirmed
GUEST, unregistred user!
这里有两个关键的细节,就是调用协议和你要调用的是一个类里面的函数。<br><br>关用默认调用约定DELPHI帮助文件里说了, 默认是通过寄存器的!<br>Calling conventions determine the order in which parameters are passed to the routine. They also affect the removal of parameters from the stack, the use of registers for passing parameters, and error and exception handling. [red]The default calling convention is register.[/red]<br>一般我们用汇编都用 寄存器 调用约定,所以把你要调用的函数声明为stdcall,这样被调用的函数负责平衡堆栈。<br><br>之后就是Self指针的问题, 因为你要调用的是一个类里的函数,根据反汇编得知,Self指针是第一个参数,而调用约定为stdcall,所以Self指针最后push<br><br>现面是代码<br>把要调用的函数定义在Form2<br> function Test(Msg: PChar): Integer; stdcall;<br><br>function TForm2.Test(Msg: PChar): Integer;<br>begin<br> MessageBox(0, Msg, Msg, MB_OK);<br> result:= 1;<br>end;<br><br>调用代码<br>var<br> Msg: PChar;<br>begin<br> Msg:= 'Hello!';<br> asm<br> push Msg<br> push Form2 //这里不能直接Push Self, 因为这里的Self是Form2<br> call TForm2.Test //有一个问题是我想用CALL+指针的方式来调用,而非如此<br> end;<br><br>希望派分时多派点[]