Writer 进来领分(25分)

  • 主题发起人 主题发起人 wp231957
  • 开始时间 开始时间
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> &nbsp; &nbsp;function Test(Msg: PChar): Integer; stdcall;<br><br>function TForm2.Test(Msg: PChar): Integer;<br>begin<br> &nbsp;MessageBox(0, Msg, Msg, MB_OK);<br> &nbsp;result:= 1;<br>end;<br><br>调用代码<br>var<br> &nbsp;Msg: PChar;<br>begin<br> &nbsp;Msg:= 'Hello!';<br> &nbsp;asm<br> &nbsp; &nbsp;push Msg<br> &nbsp; &nbsp;push Form2 &nbsp;//这里不能直接Push Self, 因为这里的Self是Form2<br> &nbsp; &nbsp;call TForm2.Test &nbsp; //有一个问题是我想用CALL+指针的方式来调用,而非如此<br> &nbsp;end;<br><br>希望派分时多派点[:D]
 
function tform1.showm(a:pchar;b:pchar;c:string):boolean;stdcall;<br>var<br> &nbsp;tmp:pchar;<br>begin<br> &nbsp;tmp:=pchar(string(a)+c);<br> &nbsp;messagebox(0,tmp,b,mb_ok);<br> &nbsp;result:=true;<br>end;<br>procedure TForm1.Button7Click(Sender: TObject);<br>var<br> &nbsp;func:pointer;<br> &nbsp;addr,addr2:pchar;<br> &nbsp;addr3:string;<br>begin<br> &nbsp;addr:='&Otilde;&acirc;&Agrave;&iuml;&Ecirc;&Ccedil;&Acirc;&Ograve;&Acirc;&euml;';<br> &nbsp;addr2:='&Otilde;&acirc;&Agrave;&iuml;&Otilde;&yacute;&sup3;&pound;';<br> &nbsp;addr3:='hahahahaha';<br> &nbsp;func:=@tform1.showm;<br> &nbsp;asm<br> &nbsp; &nbsp;push addr3<br> &nbsp; &nbsp;push addr2<br> &nbsp; &nbsp;push addr<br> &nbsp; &nbsp;push tform1//这里入栈后确不需要出栈 不明白原因,但是程序运行不会出错<br> &nbsp; &nbsp;call func<br> &nbsp; &nbsp;pop addr3<br> &nbsp; &nbsp;pop addr<br> &nbsp; &nbsp;pop addr2<br> &nbsp;end;<br>end;
 
呵呵,你小子不要分了啊
 
谁来另分
 
现在才发现你发贴了呀,晕。 <br><br>从汇编里找答案吧,很多事情不用解释。<br>在你程序第一行代码之前, DELPHI已经插入一些汇编,将ESP保存到EBP。在你最后一行代码的后面又插入一些汇编, 将ESP还原(Mov ESP, EBP)所以即使你POP 多少次,都没有出错
 
后退
顶部