我要读取20个左右内存地址的值。比如a,b,c,d,e,f……等地址
那么这些地址下有的保存的是10进制。有的保存的是字符串,那么怎么读取?
我现在的读取办法有问题,有时正常,有时非法操作!我现在是这样做的:、
procedure TMainForm.RzBitBtn1Click(Sender: TObject);
begin
 读取A地址;
 读取B地址;
 ……
end;
结果读的地址太多了。好像内存释放上有问题。所以想看看大家在这种顺序读取很多地址的情况下,应该怎么做最安全?还有就是10进制和字符串应该分别怎么读取?(大家不用考虑获得句柄和打开进程等问题,只是读取内存的问题)

解决方案 »

  1.   

    API
    ReadProcessMemory数值
    var
    buf:integer;
    begin
    ...
    ...
    ReadProcessMemory(h,$01,buf,sizeof(integer),nil);
    end;字符
    var
    buf:array[0..255]of char; //每次读256个字符
    begin
    ...
    ...
    ReadProcessMemory(h,$01,buf,sizeof(buf),nil);
    end;
      

  2.   

    ReadProcessMemory只是读出内存数据并不是锁定或是创建内存区域没有什么可释放的
    要么就是释放由OpenProcess打开的进程CloseHandle(h)
      

  3.   

    本来我也觉得只需要读就可以了,但是每次ReadProcessMemory后,我都取出值放到相应的Label中去显示,那么程序运行时,有时正常,有时就出错在某个给Label赋值的地方。如果是因为没有取出值造成的话。但是程序又有正确的显示。不知道怎么回事
      

  4.   

    20个左右内存地址的值。比如a,b,c,d,e,f……等地址那每个 地址 要读 多长 ???用 move 不错
    自己先分配 内存
    或 静态 array  [0..4095] of byte;
      

  5.   

    procedure TMainForm.Timer1Timer(Sender: TObject);
    var
      readok: DWORD;
      lpBuffer :PByte;
    begin
    //省略了获得线程等代码,下面是开始读取内存地址中的字符串
    lpBuffer:=AllocMem(nSize);
    ReadProcessMemory(pProc, Pointer($12308EC),lpBuffer,20, readok);
    label1.caption := PChar(lpBuffer);//程序有时候在这一句出错。说是错误的指针。但是有时候不会。……
    下面还有很多个这样的读取代码。都一样,只是地址不同
    end;
      

  6.   

    label1.caption := PChar(lpBuffer);//
    是错误的
    看看 #0
      

  7.   

    PChar 
    #0 
    结尾
      

  8.   

    什么意思?label1.caption := PChar(lpBuffer);这句应该怎么写?
      

  9.   

    label1.caption := strpas(lpBuffer);
      

  10.   

    没注意看类型,重写
    var
      readok: DWORD;
      lpBuffer :Pchar;
    begin
    //省略了获得线程等代码,下面是开始读取内存地址中的字符串
    lpBuffer:=StrAlloc(nSize);
    ReadProcessMemory(pProc, Pointer($12308EC),lpBuffer,nSize, readok);
    label1.caption := strpas(lpBuffer);
    ……
    end;
      

  11.   

    帮搂主顶下。
      我一般这样处理
      声明缓冲区 S: array[0..nsize+1] of char;
      然后使用FillChar将缓冲区置为#0
      ReadProcessMemory(pProc, Pointer($12308EC),@S[0],nSize, readok);
      ......
      //说点废话
      我认为需要注意的是Pointer($12308EC)这个地方有点太绝对化,可以先查看$12308EC在读出进程的那个模块中,找出该模块的影像基地址。算出这个地址相对于dll基地址的偏移量,在自己的程序中可以先找到基地址,使用基地址+偏移量的方式来读取。
      如果你所要找的地址是别人的声明的局部变量,那情况又不同了...........
      

  12.   

    zhu_jiang()  说的对
    注意 nsize+1
    或者 你用 move  copymem.....