看流星社区

 找回密码
 注册账号
查看: 2983|回复: 4

[Delphi] delphi的吃药call参数调用问题(求助)

[复制链接]

该用户从未签到

发表于 2011-4-1 15:25:14 | 显示全部楼层 |阅读模式
各位老师,现在我用DELPHI写吃药CALL调用。吃药call需要2个关键参数:一个是物品ID,一个是物品在背包的位置。 我想在单元函数里面写fucntion,给DLL中的p.......调用,请看相关代码:
DLL  
----------------------------------------------------------------------  
procedure TForm1.Button1Click(Sender: TObject); //测试  
var  
  v1,v2,v3,v4,v5,v6,v7,v8:pDWORD;  
  i,Bb_1,Bb_2,Bb_3,Bb_6,BBWPID:dword;  
  BBWPWZ:integer;  
begin  
     v1:=pointer(Rwsx_jz);   
     v1:=pointer(v1^+$1c);
     v1:=pointer(v1^+$24);   
     v1:=pointer(v1^+$8f8);   
     v4:=pointer(v1^+$10);
     v1:=pointer(v1^+$0c);  
     Bb_1:=v4^;              //最大格数  
      for i:=0 to Bb_1-1 do  
       begin
          BBWPWZ:=i;  
          v2:=pointer(v1^+i*4);   
          Bb_2:=v2^;  
          if  Bb_2<>0 then ;
          begin   
          v7:=pointer(v2^+$8); //物品ID  
          BBWPID:=v7^;  
          v3:=pointer(v2^+$4); //物品类型  
          Bb_3:=v3^;   
          if Bb_3>7 then   
               begin  
                 v8:=pointer(v2^+$68);  
                 Bb_minzi:=pointer(v8^+$4);   
               end;
              if Bb_3<7 then  
               begin  
                 v8:=pointer(v2^+$70);  
                 Bb_minzi:=pointer(v8^+$0c);   
               end;  
         // self.Memo1.Lines.Add(inttostr(BBWPWZ)+'/'+inttohex(BBWPID,8)+'/'+widechartostring(Bb_minzi));  测试刷新背包效果   
       if  widechartostring(Bb_minzi)='九福大补丸'     then   //发现背包有'九福大补丸',就吃药call  
          begin
            chiyao(BBWPID,BBWPWZ);   
          end;  
          end;  
         end;   

       end;   
-----------------------------------------------------------------------------------------------  
单元函数部分:  
------------------------------------------------------------------------------------  
unit HS;  
interface  
  function chiyao(BBWPID,BBWPWZ:integer):boolean;  //吃药  
const  
   Rwsx_jz = $9c91c0;  
   call_chiyao=$005a94e0;         //吃药   
implementation  
uses  
windows,SysUtils;
function chiyao( BBWPID,BBWPWZ:integer):boolean;   
begin  
asm   
  push 1  
  push BBWPID             !!!!!!!!!!!!!!!!测试后应该是这里传入的数值不正确,不是带$符号的十六进制。   
  push BBWPWZ                   //物品在背包中的第几格   
  push 0  
  mov ecx,[Rwsx_jz]   
  mov ecx,[ecx+$20]  
  lea ecx,[ecx+$d4]        // 注意 这里是要传址  
  mov ebx,call_chiyao  
  call ebx   
end;
  result:=true;   
end;   
--------------------------------------------------------------------------------  
现在调用就是吃不了药,(push BBWPID             !!!!!!!!!!!!!!!!测试后应该是这里传入的数值不正确,不是带$符号的十六进制。)  
应该是问题关键,但不知道那么解决好,请指教!   xiexie

该用户从未签到

发表于 2011-4-1 15:25:27 | 显示全部楼层
可以用call测试工具测试一下.直接传递id试试.
delphi写call函数,最好加上stdcall,游戏都是用c写的.

该用户从未签到

 楼主| 发表于 2011-4-1 15:25:42 | 显示全部楼层
我测试过call,call是没错的,不管是用测call工具,还是在代码内部,我用ID数据测试都是能调用的,就是无法从别处传递正确参数到ASM里面,不知道为什么

该用户从未签到

发表于 2011-4-1 15:25:58 | 显示全部楼层
BBWPID:dword;
dword类型改为integer

该用户从未签到

 楼主| 发表于 2011-4-1 15:26:09 | 显示全部楼层
感谢您的帮助,在您的指点下问题解决了,可以结贴了。

如kazuko所说:BBWPID的声明不对,改过来了后,还是无法调用,在检查了几遍发现,单元函数部分没有对BBWPID转换成带$的十六进制。
进行测试证明:在DLL部分用:self.Memo2.Lines.Add(inttostr(BBWPWZ)+'/'+ inttostr(BBWPID) );查看数据正确BBWPID的值为1841,BBWPWZ的值为21。
调用吃药call失败,游戏中提示:物品无法使用。在进到单元函数部分,function chiyao( BBWPID,BBWPWZ:integer):boolean;下我var  d:integer;。begin后
我加了一句:d:=strtoint(#36+inttohex(BBWPID,8));//将传递来的参数转换成带$ 的十六进制。然后再ASM中的物品ID调用处直接:push d 。在次进游戏测试。调用成功!!!

这次失败让我停顿了几天,总结还是自己对数据类型认识不够彻底,对DELPHI 的排错能力不够,对代码的检测不够仔细。感谢大家对该问题的回答!
特别感谢kazuko,因为有了你们的无私帮助,让天空更美丽!!!
点击按钮快速添加回复内容: 支持 高兴 激动 给力 加油 苦寻 生气 回帖 路过 感恩
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

小黑屋|手机版|Archiver|看流星社区 |网站地图

GMT+8, 2024-4-17 07:57

Powered by Kanliuxing X3.4

© 2010-2019 kanliuxing.com

快速回复 返回顶部 返回列表