我用ReadProcessMemory函数想读出QQ对对碰游戏的棋盘数组的数据可是输出的却是一个地址,但是用同样的方法读取座位号的基址就可以正确输出作为号,所以想请教一下大家这是什么原因,以下是代码:出问题的那一部分我变成绿色了。
#include "windows.h"#include <iostream.h>class jubing
{
public: HWND ctjubing; //定义一个HWND(也是一种句柄)类型的变量用来存放窗体句柄,这里千万别搞错了
DWORD pid; //存放进程id
HANDLE jcjubing; //定义一个HANDLE(句柄)类型的变量用来存放进程句柄,这里千万别搞错了
int zwh;  //定义一个用来保存座位号的变量
int chuangtijubing(); //在类里面声明一个成员函数获得窗体句柄(函数的定义部分在下面)
int jinchengid();     //在类里面声明一个成员函数获得进程ID  (函数的定义部分在下面)
int jinchengjubing(); //在类里面声明一个成员函数获得进程句柄(函数的定义部分在下面)
int zuoweihao();      //在类里面声明一个成员函数获得座位号  (函数的定义部分在下面)};
///////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////
//类成员函数的定义部分jubing::chuangtijubing() //上面声明的函数这里写定义部分(返回窗体句柄)
{

ctjubing = FindWindow(NULL,"对对碰角色版"); //获取窗体句柄
return 1;
}jubing::jinchengid() //上面声明的函数这里写定义部分(返回进程ID)
{
GetWindowThreadProcessId(ctjubing,&pid); //获取进程ID return 1;}jubing::jinchengjubing() //上面声明的函数这里写定义部分(返回进程句柄)
{
jcjubing = OpenProcess(PROCESS_ALL_ACCESS,FALSE,pid); //返回进程句柄 return 1;
}jubing::zuoweihao() //上面声明的函数这里写定义部分(返回座位号)
{
ReadProcessMemory(jcjubing,(int *)0x47c9d4,&zwh,4,NULL); //该函数用来返回座位号
return 1;
}///////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////
bool qipanshuzu()   //自定义函数实现输出棋盘数组
{
jubing a;  //实例化一个类对象
a.chuangtijubing(); //取得窗体句柄
a.jinchengid();//取得进程id
a.jinchengjubing();//取得进程句柄
a.zuoweihao(); //取得座位号
cout<<a.zwh<<endl; //输出座位号 //int shiji; int qipanshuzu[8][8]; if ((a.zwh == 0) && (a.ctjubing != NULL)) //如果座位号返回值为0并且窗体句柄不为空的话
{
ReadProcessMemory(a.jcjubing,(int *)0x479418/*0x479418是棋盘数组的基址*/,&qipanshuzu,200,0); //读取棋盘数组


cout<<qipanshuzu<<endl; //输出座位号 }

return 0;}

int main()
{

    
qipanshuzu();   //调用棋盘数组(自定义函数) return 0;
}///////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////

解决方案 »

  1.   

    是不是用了二级指针?传这个地址给ReadProcessMemory
      

  2.   

    程序运行后在屏幕上输出的是0x12FE1C    0x479418这个基址可以保证是正确的,因为我前段时间用delphi写的程序现在测试用这个基址能正确输出棋盘数组里面的数据的。然而我要输出座位号的时候我是这样写的,结果能正确输出座位号:HANDLE 进程句柄; 
    int zwh;//保存座位号
    ReadProcessMemory(进程句柄,(int *)0x47c9d4/*座位号基址*/,&zwh,4,NULL); //该函数用来返回座位号
    cout<<zwh<<endl;
    这样写正确输出了座位号。但是我想输出棋盘数组的时候是下面这样写的输出的结果就是0x12FE1C :HANDLE 进程句柄; 
    int qipanshuzu[8][8]; //保存棋盘数组ReadProcessMemory(进程句柄,(int *)0x479418/*0x479418是棋盘数组的基址*/,&qipanshuzu,200,0); //读取棋盘数组cout<<qipanshuzu<<endl; 这句完了输出的结果是0x12FE1C
      

  3.   

    ReadProcessMemory(进程句柄,(int *)0x479418/*0x479418是棋盘数组的基址*/,&qipanshuzu,200,0);
    ReadProcessMemory(进程句柄,(LPVOID)0x479418地址 (int *) 有问题吧,少了一半了。应该是VOID 或 DWORD 类型
      

  4.   

    int qipanshuzu[8*8]; //保存棋盘数组ReadProcessMemory(进程句柄,(int *)0x479418/*0x479418是棋盘数组的基址*/,qipanshuzu , 8*8*4,0); //读取棋盘数组for(int i=0; i<8*8; ++i)
    cout<<qipanshuzu[i]<<endl; 
      

  5.   

    我找到问题了,问题出在int qipanshuzu[8][8]; //保存棋盘数组   这一个数组的定义上,虽然上面的朋友都没回答正确,但是可能是因为我的提问问题的方向误导了大家吧,所以还是感谢大家了,另外我是把这句改成了bool qipanshuzu[8][25]; 以后程序正确输出棋盘数组里面的内容了的,我看了下delphi的源码定义的是byte的类型,可是在vc里面就不行然后我试了下用bool类型却成功了,呵呵关于这个问题我还是另开贴再问大家吧,总之谢谢大家的回答了。
      

  6.   

    在C里是一个byte,所以你碰运气选了个bool.刚好也是一个byte,所以对了..