高手来看下 我那里出错了

shcxd001 2010-12-30 11:08:45
1单元
Const RoleBaseAdr=$62C7C0; //主号基址


Function RWord(Addr: Dword): WORD;读双字节整型
begin
Result := 0;
Try
EnterCriticalSection(Critical1); //进入临界段
try
if PWORD(Addr) <> nil then
begin
Result := PWORD(Addr)^;
end;
finally
LeaveCriticalSection(Critical1); //退出临界段
end;
except
Result := 0;
end;
end;

Function RDword(Addr: Dword): Dword;读四字节整型
begin
Result := 0;
Try
EnterCriticalSection(Critical1); //进入临界段
try
if PDWORD(Addr) <> nil then
begin
Result := PDWORD(Addr)^;
end;
finally
LeaveCriticalSection(Critical1); //退出临界段
end;
except
Result := 0;
end;
end;

2单元

Function GetRoleHP: DWORD; //获取主号人物当前HP
var
RoleBase: DWORD;
begin
Try
RoleBase := RDword(RoleBaseAdr);
Result:= Rword(RoleBase+ $68); //人物当前HP
except
Result:=0;
end;
end;

取函数

GetRoleHP


RzEdit18.Text:=IntToStr(GetRoleHP);

可是读取的是0

如果用汇编直接读取的话就正确

var
Address:pointer;
y,n,p,i:DWORD;
begin
Address:=pointer(RoleBaseAdr);
asm
pushad
mov eax,address
mov eax, dword ptr[eax]
mov eax, dword ptr[eax+$68]
mov i, eax
popad
end;
MyForm.RzEdit5.Text:=IntToStr(i);

请前辈们指导一下

...全文
141 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
shcxd001 2010-12-31
  • 打赏
  • 举报
回复
前辈就是前辈 可是用DELPHI 读取就是0 我有点郁闷
  • 打赏
  • 举报
回复
看不出明显的问题所在,rword和rdword那两个函数的if..<>nil判断可以去掉,没啥用,进入临界区就这些代码看起来也没什么用,如果那段内嵌汇编是正确的话那就用吧,Address:=pointer(RoleBaseAdr);这句没用,直接把RoleBaseAdr传给eax,先强制转换成指针再传递不是脱了裤子放屁么。
ddzjok 2010-12-31
  • 打赏
  • 举报
回复
程序没有什么问题,单步跟踪看看。
shcxd001 2010-12-31
  • 打赏
  • 举报
回复
有前辈指导下吗
chengg828 2010-12-31
  • 打赏
  • 举报
回复
mov eax,address
mov eax, dword ptr[eax]
mov eax, dword ptr[eax+$68]
mov i, eax

你的RDword读的是上述汇编第二行的ax值

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧