如何枚举系统进程及进程相关信息(如CPU占用率,内存占用等等)?

Description of your first forum.

如何枚举系统进程及进程相关信息(如CPU占用率,内存占用等等)?

帖子taibu » 星期五, 2006年4月7日 13:42


从网上找到下面方法,但不成功,不知问题在哪,各位还有其它更好的方法吗?
function TForm1.EnumProcessNT(var ProcArray: TProcessNTArray): Integer;
var
 i : Integer;
 Count : DWORD;
 ProcHand : THandle;
 ModHand : HMODULE;
 pList : array of DWORD;
 ModName : array[0..MAX_PATH] of char;
 BigArray : array[0..$3FFF-1] of DWORD; //大数组,因为不知道能预分配内存大小
begin
 if not EnumProcesses(@BigArray,SizeOf(BigArray),Count) then raise Exception.Create('sFailMessage');
 Result := Count Div SizeOf(DWORD);
 SetLength(pList,Result);
 Move(BigArray,pList[0],Count);
 SetLength(ProcArray,Result);
 for i:= low(pList) to High(pList) do
 begin
  procHand := OpenProcess(PROCESS_QUERY_INFORMATION  or PROCESS_VM_READ,
               False,pList[i]);
  if procHand >0 then
  try
    EnumProcessModules(ProcHand,@ModHand,1, Count);
    if GetModuleFileName(ProcHand,ModName, SizeOf(ModName))>0 then
     with ProcArray[i] do
      begin
       pID       := pList[i];
       szExeFile := delphi.com/topic_517179_865f.htm">StrPas (ModName);
       pHandle   := ProcHand;
       pPriClass := GetPriorityClass(ProcHand);
      end;
  finally
    CloseHandle(procHand);
  end;
 end;
end;
 
 
 

如何枚举系统进程及进程相关信息(如CPU占用率,内存占用等等)?

帖子happycyp » 星期五, 2006年4月7日 13:46


首先我们应该调用CreateToolhelp32Snapshot创建快照;然后调用Process32First,把创建的快照的句柄传递给hSnapshot参数,函数成功返回后我们将在lppe参数中得到第一个进程的信息;继续调用Process32Next,我们将得到后续的进程信息,直到Process32Next返回False为止。记住最后我们应该调用CloseHandle把快照的句柄安全的释放。

是不是很简单?下面是范例的源程序,为了简单起见,我只写了关键的语句。

uses ... TLHelp32, ... // 需要用到TLHelp32单元即Toolhelp API library.

type
TForm1 = class(TForm)
...
end;

var
Form1: TForm1;
MyProcess : Tlist; // 返回的进程信息在MyProcess这个TList中。

type
TProcessInfo = Record
ExeFile : String;
ProcessID : DWORD;
end;
pProcessInfo = ^TProcessInfo;

implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
var
p : pProcessInfo;
IsLoopContinue:BOOL;
FSnapshotHandle:THandle;
FProcessEntry32:TProcessEntry32;
begin
MyProcess := TList.Create; // 保存进程信息的列表
MyProcess.Clear; // 初始化列表
FSnapshotHandle:=
CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); // 创建系统快照
FProcessEntry32.dwSize:=Sizeof(FProcessEntry32); // 必须先设置结构的大小
IsLoopContinue:=
Process32First(FSnapshotHandle,FProcessEntry32); //得到第一个进程信息
while integer(IsLoopContinue)<>0 do
begin
New(p);
p.ExeFile := FProcessEntry32.szExeFile;
p.ProcessID := FProcessEntry32.th32ProcessID;
MyProcess.Add(p); // 添加进程信息
IsLoopContinue:=Process32Next(FSnapshotHandle,FProcessEntry32); // 继续枚举
end;
CloseHandle(FSnapshotHandle); // 释放快照句柄
end;

procedure TForm1.FormDestroy(Sender: TObject);
var
p : pProcessInfo;
i : integer;
begin
With MyProcess do
for i := Count - 1 DownTo 0 do
begin
p := items[i];
Dispose(p); // 清除动态分配的内存
Delete(i); // 删除列表中的项
end;
end;

...

end.
《Delphi下深入Windows核心编程》这本书里有介绍。
 
 
 

如何枚举系统进程及进程相关信息(如CPU占用率,内存占用等等)?

帖子taibu » 星期五, 2006年4月7日 14:08


我上面那种方法有谁能帮我改改?
 
 
 

如何枚举系统进程及进程相关信息(如CPU占用率,内存占用等等)?

帖子happycyp » 星期五, 2006年4月7日 14:34


use  TLHelp32,Shellapi
试一下。
 
 
 

如何枚举系统进程及进程相关信息(如CPU占用率,内存占用等等)?

帖子taibu » 星期五, 2006年4月7日 15:09


如何获取CPU占用率,内存占用等等
 
 
 

如何枚举系统进程及进程相关信息(如CPU占用率,内存占用等等)?

帖子taibu » 星期四, 2006年5月25日 16:29


接受答案了.