buf:string;  
ReadProcessMemory(hProcessHandle,  Pointer(Address),  @buf,  Len,  lpNumberOfBytes);  
其他都没问题,执行也ok,但是执行好了一旦引用buf程序就出错  
比如edit1.text:=buf;  
程序就错误

解决方案 »

  1.   

    如果定义buf为string,则在调用ReadProcessMemory之前得先用SetLength设置该buf的大小,然后调用的时候
    ReadProcessMemory(hProcessHandle,  Pointer(Address),  PChar(buf[1]),  Len,  lpNumberOfBytes);  
    试试看
      

  2.   

    我发现没有读取成功
    System Error Codes 299
    该怎么解决?
    ProcessIDHandle:=GetProcessID(pchar('excel.exe'));
    address:=$1;
    len:=1;
    ReadProcessMemory(hProcessHandle,  Pointer(Address),  @buf,  Len,  lpNumberOfBytes); 
    buf为byte数组[0..3]
      

  3.   

    你的getprocecessid是自定义函数??
      

  4.   

    是自定义函数
    窗口句柄取回没有问题,上面写错了,应该是
    ReadProcessMemory(processidhandle,  Pointer(Address),  @buf,  Len,  lpNumberOfBytes);
      

  5.   

    buf:array [0..9] of char;  
    ReadProcessMemory(hProcessHandle,  Pointer(Address),  @buf,  10,  lpNumberOfBytes);  
      

  6.   

    还是一样啊
    System Error Codes 299
    Only part of a ReadProcessMemory or WriteProcessMemory request was completed. ERROR_PARTIAL_COPY
      

  7.   

    function GetProcessMemoryForID(ProcessID: THandle; Address: LongWord; Buf: Pointer; Len: LongWord): boolean;
    var
    hProcessHandle: THandle;
    lpNumberOfBytes: LongWord;
    begin
      Result := false;
    if ProcessID = 0 then exit;   //如果进程不存在,返回  hProcessHandle := OpenProcess(PROCESS_VM_READ, false, ProcessID);
    if hProcessHandle = 0 then exit;   try
    //读进程
     if ReadProcessMemory(hProcessHandle, Pointer(Address), buf, Len, lpNumberOfBytes) then
       showmessage('getmemok');
       showmessage(inttostr(getlasterror()));
      finally
    CloseHandle(hProcessHandle);   end;   Result := True;
    end;这是读取的函数,程序中用的是
    GetProcessMemoryForID(ProcessIDHandle,Address,@buf,len);
      

  8.   

    给你个完整的例子
    var
    buf:array [0..9] of char; //这里确定你要读取几个字节  hw := FindWindow(nil,'标题');
      if hw = 0 then Exit;
      GetWindowThreadProcessId(hw, @pid);
      h := OpenProcess(PROCESS_ALL_ACCESS, false, pid);
      if h = 0 then
        Exit;ReadProcessMemory(h,  Pointer(Address),  @buf,  sizeof(buf),  lpNumberOfBytes);  
    edit1.text:=strpas(buf);
      

  9.   

    function GetProcessID(EXE_Name: PChar): THandle;
    var
      s: string;
      ok: Bool;
      ProcessListHandle: THandle;
      ProcessStruct: TProcessEntry32;
    begin
    Result := 0;
    //获得进程列表句柄
      ProcessListHandle := CreateToolHelp32Snapshot(TH32CS_SNAPPROCESS, 0);
      try
      ProcessStruct.dwSize := Sizeof(ProcessStruct);
       //获得第一个进程句柄
      ok := Process32First(ProcessListHandle, ProcessStruct);   while ok do
      begin
         s := ExtractFileName(ProcessStruct.szExeFile); //获取进程的可执行文件名称
         if AnsiCompareText(Trim(s), EXE_Name)=0 then
        begin
           Result := ProcessStruct.th32ProcessID;
            showmessage('ok');         break;
         end;
         ok := Process32Next(ProcessListHandle, ProcessStruct); //获取下一个进程信息。
      end;
      finally
      CloseHandle(ProcessListHandle); //关闭进程列表句柄
      end;
    end;
      

  10.   

    而且我发现读取没有成功
    if ReadProcessMemory(h,  Pointer(Address),  @buf1,  sizeof(buf1),  lpNumberOfBytes) then
       showmessage('ok');
    没有出现提示框
    showmessage(inttostr(getlasterror()));
    错误还是299
      

  11.   

    程序上应该没有什么问题
    可能是地址不存在造成的
    net helpmsg 299