内存双字节读取!

TangJunLin2002 2003-08-24 09:10:38
当内存地址0x01005A60的值小于255也就是可以放在一个字节里的时候,使用下面程序可以正确的把直读出显示到m_edit中!但是当程序的值也就是扫雷这个游戏超过255个雷的时候,下面程序显示的数值就不对了!
假设你设置256个累的话,读出的值就是0,257是1,258是2!!

怎么修改下面的程序,避免这个错误,请大家帮帮忙!
////////////////////////////////////////////////////////////////
DWORD hProcId;
char* HP = new char[20];
HWND hWnd=::FindWindow(NULL,"扫雷");
GetWindowThreadProcessId(hWnd,&hProcId);
HANDLE nOK =OpenProcess(PROCESS_ALL_ACCESS|PROCESS_TERMINATE|PROCESS_VM_OPERATION|PROCESS_VM_READ|PROCESS_VM_WRITE,FALSE,hProcId);
BOOL OK=ReadProcessMemory(nOK,(LPCVOID)0x01005A60,HP,1,NULL);
if (OK != TRUE)
MessageBox("失败);
m_edit.Format(_T("%d"),HP[0]);
UpdateData(FALSE);
/////////////////////////////////////////////////////////////////////
...全文
187 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
双杯献酒 2003-08-26
  • 打赏
  • 举报
回复
问题出在:
m_edit.Format(_T("%d"),HP[0]);
中的HP是char

如果读INT
应该修改
char* HP = new char[20];

int* HP = new int[20];
TangJunLin2002 2003-08-26
  • 打赏
  • 举报
回复
感谢 whoishere(我来也) 回答我的问题,接分!
whoishere 2003-08-26
  • 打赏
  • 举报
回复
照下面这样就可以了:
DWORD hProcId;
char* HP = new char[20];
HWND hWnd=::FindWindow(NULL,"扫雷");
GetWindowThreadProcessId(hWnd,&hProcId);
HANDLE nOK =OpenProcess(PROCESS_ALL_ACCESS|PROCESS_TERMINATE|PROCESS_VM_OPERATION|PROCESS_VM_READ|PROCESS_VM_WRITE,FALSE,hProcId);

BOOL OK=ReadProcessMemory(nOK,(LPCVOID)0x01005A60,HP,4,NULL);
if (OK != TRUE)
MessageBox("失败");

DWORD dwHP = *(LPDWORD)HP;
m_edit.Format(_T("%d"),dwHP);
UpdateData(FALSE);
TangJunLin2002 2003-08-26
  • 打赏
  • 举报
回复
还是不对!277 仍然M_EDIT里面显示21!!!!
救命呀?这是怎么搞的哦!
我在也看不出要怎么改了,大家帮帮忙啊!
天鹅梦 2003-08-26
  • 打赏
  • 举报
回复
ReadProcessMemory(nOK,(LPCVOID)0x01005A60,HP,1,NULL)中的LPCVOID改为(int*)试试
TangJunLin2002 2003-08-26
  • 打赏
  • 举报
回复
我晕还是不对,按楼上的改0都显示-842150656了!!!成////////////////////////////////////////////////////////////////
DWORD hProcId;
int* HP = new int[20];
HWND hWnd=::FindWindow(NULL,"扫雷");
GetWindowThreadProcessId(hWnd,&hProcId);
HANDLE nOK =OpenProcess(PROCESS_ALL_ACCESS|PROCESS_TERMINATE|PROCESS_VM_OPERATION|PROCESS_VM_READ|PROCESS_VM_WRITE,FALSE,hProcId);
BOOL OK=ReadProcessMemory(nOK,(LPCVOID)0x01005A60,HP,1,NULL);
if (OK != TRUE)
MessageBox("失败);
m_edit.Format(_T("%d"),HP[0]);
UpdateData(FALSE);
/////////////////////////////////////////////////////////////////////
这这……到底是怎么回事啊??哪个大哥帮帮我啊
TangJunLin2002 2003-08-25
  • 打赏
  • 举报
回复
在顶
TangJunLin2002 2003-08-25
  • 打赏
  • 举报
回复
UP
TangJunLin2002 2003-08-24
  • 打赏
  • 举报
回复
joinrry(骑着小猪去流浪) 你的方法都不对!

cy214(threadx)
我查看HEX发现确实是你说的那样,但是我使用int *强制转换以后还是一样的效果啊!
256还是显示0!!

joinrry 2003-08-24
  • 打赏
  • 举报
回复
四个字节就是:
m_edit.Format(_T("%d"),*(DWORD *)HP);
joinrry 2003-08-24
  • 打赏
  • 举报
回复
很简单的啦!
用指针强制转换就行啦!

m_edit.Format(_T("%d"),HP[0]);
改成:
m_edit.Format(_T("%d"),*(WORD *)HP);
cy214 2003-08-24
  • 打赏
  • 举报
回复
你的函数必须要传void *吗 如果是的话又要读4字节的int的话试试在函数中吧void *的指针强制转化为int *
cy214 2003-08-24
  • 打赏
  • 举报
回复
按照你说的情况看来你读的是一个int 你得清楚c++中int类型的数据在内存里存放的情况
四个字节 一共32位 首先前后16位颠倒 然后每个16位的低八8位和高8位颠倒
比如:
int a=256;
转换成普通顺序的四个字节的hex应该是
00 00 01 00
但是你去找a的地址&a的内存数据时 看到的应该是
00 01 00 00
而看来你现在是按照int a的首地址去读的 当然就读不到了 256已经进位了
所以最好还是按照数据类型读 别去直接读地址 ^^
TangJunLin2002 2003-08-24
  • 打赏
  • 举报
回复
我记的
ReadProcessMemory(nOK,(LPCVOID)0x01005A60,HP,1,NULL);第4个参数是要读的字节数!!
但是我写成
ReadProcessMemory(nOK,(LPCVOID)0x01005A60,HP,2,NULL);
还是不对!
TangJunLin2002 2003-08-24
  • 打赏
  • 举报
回复
对了还有,要是一个大数字放在了4个字节中又怎么读取?

15,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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