- 注册时间
- 2011-3-6
- 最后登录
- 1970-1-1
该用户从未签到
|
各位老师,现在我用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 |
|