ilih 发表于 2011-4-1 15:25:14

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

各位老师,现在我用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^;
          ifBb_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));测试刷新背包效果   
       ifwidechartostring(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,   
mov ecx,
lea ecx,      // 注意 这里是要传址
mov ebx,call_chiyao
call ebx   
end;
result:=true;   
end;   
--------------------------------------------------------------------------------
现在调用就是吃不了药,(push BBWPID             !!!!!!!!!!!!!!!!测试后应该是这里传入的数值不正确,不是带$符号的十六进制。)
应该是问题关键,但不知道那么解决好,请指教!   xiexie

joe85231 发表于 2011-4-1 15:25:27

可以用call测试工具测试一下.直接传递id试试.
delphi写call函数,最好加上stdcall,游戏都是用c写的.

ilih 发表于 2011-4-1 15:25:42

我测试过call,call是没错的,不管是用测call工具,还是在代码内部,我用ID数据测试都是能调用的,就是无法从别处传递正确参数到ASM里面,不知道为什么

ldnhhy 发表于 2011-4-1 15:25:58

BBWPID:dword;
dword类型改为integer

ilih 发表于 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;下我vard:integer;。begin后
我加了一句:d:=strtoint(#36+inttohex(BBWPID,8));//将传递来的参数转换成带$ 的十六进制。然后再ASM中的物品ID调用处直接:push d 。在次进游戏测试。调用成功!!!

这次失败让我停顿了几天,总结还是自己对数据类型认识不够彻底,对DELPHI 的排错能力不够,对代码的检测不够仔细。感谢大家对该问题的回答!
特别感谢kazuko,因为有了你们的无私帮助,让天空更美丽!!!
页: [1]
查看完整版本: delphi的吃药call参数调用问题(求助)