当内存地址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);
/////////////////////////////////////////////////////////////////////

解决方案 »

  1.   

    我记的
    ReadProcessMemory(nOK,(LPCVOID)0x01005A60,HP,1,NULL);第4个参数是要读的字节数!!
    但是我写成
    ReadProcessMemory(nOK,(LPCVOID)0x01005A60,HP,2,NULL);
    还是不对!
      

  2.   

    按照你说的情况看来你读的是一个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已经进位了
    所以最好还是按照数据类型读 别去直接读地址 ^^
      

  3.   

    你的函数必须要传void *吗 如果是的话又要读4字节的int的话试试在函数中吧void *的指针强制转化为int *
      

  4.   

    很简单的啦!
    用指针强制转换就行啦!m_edit.Format(_T("%d"),HP[0]); 
    改成:
    m_edit.Format(_T("%d"),*(WORD *)HP);
      

  5.   

    四个字节就是:
    m_edit.Format(_T("%d"),*(DWORD *)HP);
      

  6.   

    joinrry(骑着小猪去流浪) 你的方法都不对!cy214(threadx) 
    我查看HEX发现确实是你说的那样,但是我使用int *强制转换以后还是一样的效果啊!
    256还是显示0!!
      

  7.   

    问题出在:
    m_edit.Format(_T("%d"),HP[0]); 
    中的HP是char如果读INT
    应该修改
    char* HP = new char[20];

    int* HP = new int[20];
      

  8.   

    我晕还是不对,按楼上的改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);
    /////////////////////////////////////////////////////////////////////
    这这……到底是怎么回事啊??哪个大哥帮帮我啊
      

  9.   

    ReadProcessMemory(nOK,(LPCVOID)0x01005A60,HP,1,NULL)中的LPCVOID改为(int*)试试
      

  10.   

    还是不对!277 仍然M_EDIT里面显示21!!!!
    救命呀?这是怎么搞的哦!
    我在也看不出要怎么改了,大家帮帮忙啊!
      

  11.   

    照下面这样就可以了:
    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);
      

  12.   

    感谢 whoishere(我来也) 回答我的问题,接分!