这个函数:
function GetProcessIDD(ProcessName: string): TProcessEntry32;
var
  FSnapshotHandle: THandle;
  FProcessEntry32: TProcessEntry32;
  Ret: Boolean;
  TmpProcessName: string;
begin
  FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  FProcessEntry32.dwSize := SizeOf(FProcessEntry32);
  Ret := Process32First(FSnapshotHandle, FProcessEntry32);
  while Ret do
  begin
    TmpProcessName := ExtractFileName(FProcessEntry32.szExeFile);
    if TmpProcessName = ProcessName then
    begin
      Result := FProcessEntry32;
      Break;
    end;
    Ret := Process32Next(FSnapshotHandle, FProcessEntry32);
  end;
  CloseHandle(FSnapshotHandle);
end;
这个是运行代码:
var
  FProcessEntry32: TProcessEntry32;
  ProcessID: integer;
  ProcessHandle: THandle;
  nSize: DWORD;
  lpNumberOfBytesRead: DWORD;
  szBuf:array[0..255] of char;
const
  ammz = $04402160;
begin
  nSize:=255;
  FProcessEntry32 := GetProcessIDD(DDZProcessName);
  if FProcessEntry32.th32ProcessID=0 then exit;
  ProcessID := FProcessEntry32.th32ProcessID;
  ProcessHandle := OpenProcess(PROCESS_VM_READ, false, ProcessID);
  if ProcessHandle <> 0 then
    begin
       ReadProcessMemory(ProcessHandle, Pointer(ammz),@szBuf,nSize,lpNumberOfBytesRead);
       label7.caption := szBuf;
    end;
  FreeMem(@szBuf,nSize);
  CloseHandle(ProcessHandle);
end;请高手们帮我看看,我的代码哪里出错了,我一运行后,系统就死机!在线等
先谢谢各位大虾!

解决方案 »

  1.   

    现在没有死机,可以正确读取内存数据,但现在出现了错误提示“Invalid pointer operation”,到底是哪里出现这种错误?是不是内存释放这里出错,如果错了,如何改?请高手们帮助看看,谢谢!
      

  2.   

    FreeMem(@szBuf,nSize); 放在 if   ProcessHandle   <>   0   then 里面。因为可能szBuf没有分配。
      

  3.   

    FreeMem(@szBuf,nSize);这句话多余的
      

  4.   

    szbuf是静态数组,不需要释放freemem只用来释放getmem调用分配的地址空间