有这里有一段代码,是在SpeedButton里执行的轮循操作,没有问题:
================================================
unit MainFrm;interfaceuses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, TLHelp32, ComCtrls, ExtCtrls, Buttons, ImgList;const
   PROCESS_TERMINATE=$0001;
type
  TfrmMain = class(TForm)
    lsvProcess: TListView;
    pnlMain: TPanel;
    stsMessage: TStatusBar;
    lsiLargeIcon: TImageList;
    lsiSmallIcon: TImageList;
    spdLargeIcon: TSpeedButton;
    spdSmallIcon: TSpeedButton;
    spdList: TSpeedButton;
    spdReport: TSpeedButton;
    spdRefresh: TSpeedButton;
    procedure spdLargeIconClick(Sender: TObject);
    procedure spdSmallIconClick(Sender: TObject);
    procedure spdListClick(Sender: TObject);
    procedure spdReportClick(Sender: TObject);
    procedure spdRefreshClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure lsvProcessDblClick(Sender: TObject);
  private
    { Private declarations }
    FSnapshotHandle:THandle;
    FProcessEntry32:TProcessEntry32;
    procedure DisplayHint(Sender: TObject);
  public
    { Public declarations }
  end;var
  frmMain: TfrmMain;implementation{$R *.DFM}procedure TfrmMain.DisplayHint(Sender: TObject);
begin
   stsMessage.SimpleText := Application.Hint;
end;procedure TfrmMain.spdLargeIconClick(Sender: TObject);
begin
   lsvProcess.ViewStyle:=vsIcon;
end;procedure TfrmMain.spdSmallIconClick(Sender: TObject);
begin
   lsvProcess.ViewStyle:=vsSmallIcon;
end;procedure TfrmMain.spdListClick(Sender: TObject);
begin
   lsvProcess.ViewStyle:=vsList;
end;procedure TfrmMain.spdReportClick(Sender: TObject);
begin
   lsvProcess.ViewStyle:=vsReport;
end;procedure TfrmMain.spdRefreshClick(Sender: TObject);
var
   i:integer;
   ContinueLoop:BOOL;
   NewItem : TListItem;
begin
   lsvProcess.Items.Clear;
   FSnapshotHandle:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
   FProcessEntry32.dwSize:=Sizeof(FProcessEntry32);
   ContinueLoop:=Process32First(FSnapshotHandle,FProcessEntry32);
   while integer(ContinueLoop)<>0 do
   begin
        NewItem:=lsvProcess.Items.add;
        NewItem.Caption:=ExtractFileName(FProcessEntry32.szExeFile);
        NewItem.subItems.Add(IntToHex(FProcessEntry32.th32ProcessID,4));
        NewItem.subItems.Add(FProcessEntry32.szExeFile);
        ContinueLoop:=Process32Next(FSnapshotHandle,FProcessEntry32);
   end;
   CloseHandle(FSnapshotHandle);
end;procedure TfrmMain.FormCreate(Sender: TObject);
begin
   Application.OnHint := DisplayHint;
   spdRefreshClick(Sender);
end;procedure TfrmMain.lsvProcessDblClick(Sender: TObject);
var
   Ret : BOOL;
   ProcessID : integer;
   ProcessHndle : THandle;
begin
   try
        with lsvProcess do
        begin
             if MessageDlg('Do You Want To Terminate "'+ItemFocused.Caption+'"?',mtConfirmation,[mbYes,mbNo],0)=mrYes then
             begin
                  ProcessID:=StrToInt('$'+ItemFocused.SubItems[0]);
                  ProcessHndle:=OpenProcess(PROCESS_TERMINATE,BOOL(0),ProcessID);
                  Ret:=TerminateProcess(ProcessHndle,0);
                  if Integer(Ret)=0 Then
                       MessageDlg('Can Not Terminate "'+ItemFocused.Caption+'"',mtInformation,[mbOk],0)
                   else
                       ItemFocused.Delete;
                  end;
        end;
   except
   end;        
end;end.

解决方案 »

  1.   

    BOOL WINAPI Process32First( 
    HANDLE hSnapshot //  
    由 CreateToolhelp32Snapshot 返回 
    的系统快照句柄; 
    LPPROCESSENTRY32 lppe // 指向一个 PROCESSENTRY32 结构; 
    ); 
    BOOL WINAPI Process32Next( 
    HANDLE hSnapshot // 由 CreateToolhelp32Snapshot 返回 
    的系统快照句柄; 
    LPPROCESSENTRY32 lppe // 指向一个 PROCESSENTRY32 结构; 
    ); 
    hSnapshot 由 CreateToolhelp32Snapshot 返回的系统快照句柄; 
    CreateToolhelp32Snapshot 原形如下: 
    HANDLE WINAPI CreateToolhelp32Snapshot( 
    DWORD dwFlags, // 快照标志;  
    DWORD th32ProcessID // 进程ID; 
    ); 
    现在需要的是进程的信息,所以将 dwFlags  
    指定为 TH32CS_SNAPPROCESS, 
    th32ProcessID 忽略;PROCESSENTRY32 结构如下: 
    typedef struct tagPROCESSENTRY32 {  
    DWORD dwSize; // 结构大小; 
    DWORD cntUsage; // 此进程的引用计数; 
    DWORD th32ProcessID; // 进程ID; 
    DWORD th32DefaultHeapID; // 进程默认堆ID; 
    DWORD th32ModuleID; // 进程模块ID; 
    DWORD cntThreads; // 此进程开启的线程计数; 
    DWORD th32ParentProcessID;// 父进程ID; 
    LONG pcPriClassBase; // 线程优先权; 
    DWORD dwFlags; // 保留;  
    char szExeFile[MAX_PATH]; // 进程全名; 
    } PROCESSENTRY32; 
    ---- 至此,所用到的主要函数已介绍完,实现读内存只要从下到上依次调用上述函数即可,具体参见原代码:  
    procedure TForm1.Button1Click(Sender: TObject); 
    var 
    FSnapshotHandle:THandle; 
    FProcessEntry32:TProcessEntry32; 
    Ret : BOOL; 
    ProcessID : integer; 
    ProcessHndle : THandle; 
    lpBuffer:pByte; 
    nSize: DWORD; 
    lpNumberOfBytesRead: DWORD; 
    i:integer; 
    s:string; 
    begin 
    FSnapshotHandle:=CreateToolhelp32Snapshot( 
    TH32CS_SNAPPROCESS,0); 
    //创建系统快照 
    FProcessEntry32.dwSize:=Sizeof(FProcessEntry32); 
    //先初始化 FProcessEntry32 的大小 
    Ret:=Process32First(FSnapshotHandle,FProcessEntry32); 
    while Ret do 
    begin 
    s:=ExtractFileName(FProcessEntry32.szExeFile); 
    if s='KERNEL32.DLL' then 
    begin 
    ProcessID:=FProcessEntry32.th32ProcessID; 
    s:=''; 
    break; 
    end; 
    Ret:=Process32Next(FSnapshotHandle,FProcessEntry32); 
    end; 
    //循环枚举出系统开启的所有进程,找出"Kernel32.dll" 
    CloseHandle(FSnapshotHandle); 
    Memo1.Lines.Clear ; 
    memo1.lines.add('Process ID '+IntToHex( 
    FProcessEntry32.th32ProcessID,8)); 
    memo1.lines.Add('File name '+FProcessEntry32.szExeFile); 
    ////输出进程的一些信息  
    nSize:=4; 
    lpBuffer:=AllocMem(nSize); 
    ProcessHndle:=OpenProcess(PROCESS_VM_READ,false,ProcessID); 
    memo1.Lines.Add ('Process Handle '+intTohex(ProcessHndle,8)); 
    for i:=$00800001 to $0080005f do 
    begin 
    ReadProcessMemory( 
    ProcessHndle, 
    Pointer(i), 
    lpBuffer, 
    nSize, 
    lpNumberOfBytesRead 
    ); 
    s:=s+intTohex(lpBuffer^,2)+' '; 
    //读取内容 
    if (i mod 16) =0 then 
    begin 
    Memo1.Lines.Add(s); 
    s:=''; 
    end; 
    //格式化输出 
    end; 
    FreeMem(lpBuffer,nSize); 
    CloseHandle(ProcessHndle); 
    //关闭句柄,释放内存 
    end;