Delphi 无法检索进程内存使用情况

Delphi 无法检索进程内存使用情况,delphi,winapi,Delphi,Winapi,我正试图编写一个小实用程序来检索计算机上正在运行的进程列表以及每个进程所使用的内存 到目前为止,我有以下Delphi代码: { ****************************************************************** Return list of running processes ******************************************************************* } procedure T

我正试图编写一个小实用程序来检索计算机上正在运行的进程列表以及每个进程所使用的内存

到目前为止,我有以下Delphi代码:

{ ******************************************************************
  Return list of running processes
 ******************************************************************* }
procedure   TGkrTools.GetProcList(var thelist : tstrings);

var
 ExeName : string;
 PSize   : cardinal;
 PID     : cardinal;
 TheLoop : boolean;
 proc    : PROCESSENTRY32;
 hSnap   : HWND;
 pmc     : PPROCESS_MEMORY_COUNTERS;
 cb      : integer;

begin
 thelist.Clear; // Clear the list on entry
 proc.dwSize := SizeOf(PROCESSENTRY32);//Give proc.dwSize the Size of bytes of PROCESSENTRY32
 hSnap := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
 TheLoop := Process32First(hSnap,proc);
 while Integer(TheLoop) <> 0 do
 begin
  ExeName := ExtractFileName(proc.szExeFile); // Name of process executable
  cb := SizeOf(_PROCESS_MEMORY_COUNTERS);
  GetMem(pmc, cb);
  pmc^.cb := cb;
  PID:=proc.th32ProcessID;
  if GetProcessMemoryInfo(PID, pmc, cb) then
  begin
   Psize:=pmc^.WorkingSetSize;
  end
  else
  begin
   Psize:=0;
  end;
  Thelist.Add(ExeName + ' ' + IntToStr(Psize)+ ' ' + IntToStr(PID));
  TheLoop := Process32Next(hSnap,proc);//Looper is oposite Zero until there is a program to process by this function
 end;
end;
{******************************************************************
返回正在运行的进程的列表
******************************************************************* }
过程TGkrTools.GetProcList(变量列表:tstrings);
变量
ExeName:字符串;
普西泽:红衣主教;
PID:基数;
逻辑运算:布尔运算;
进程:PROCESSENTRY32;
hSnap:HWND;
pmc:进程\内存\计数器;
cb:整数;
开始
列表。清除;//输入时清除列表
proc.dwSize:=SizeOf(PROCESSENTRY32)//为proc.dwSize指定PROCESSENTRY32的字节大小
hSnap:=CreateToolhelp32Snapshot(TH32CS\u SNAPPROCESS,0);
TheLoop:=Process32First(hSnap,proc);
而整数(TheLoop)0做
开始
ExeName:=ExtractFileName(proc.szExeFile);//进程可执行文件的名称
cb:=SizeOf(_进程_内存_计数器);
GetMem(pmc、cb);
pmc^.cb:=cb;
PID:=proc.th32ProcessID;
如果GetProcessMemoryInfo(PID、pmc、cb),则
开始
Psize:=pmc^.WorkingSetSize;
结束
其他的
开始
Psize:=0;
结束;
添加(ExeName++''+IntToStr(Psize)+''+IntToStr(PID));
TheLoop:=Process32Next(hSnap,proc)//在有程序通过此函数处理之前,Looper为零
结束;
结束;
我成功地检索了“ExeName”和“PID”,但当我执行GetProcessMemoryInfo函数时,调用返回“false”

关于我的代码中的错误有什么想法吗? 我在32位Windows7机器上运行这个

提前感谢,

Gudfinnur Kristjansson

你应该仔细阅读这本书。第一个参数是进程句柄,而不是进程ID。您需要调用
OpenProcess
从进程ID获取进程句柄。文档还说明:

句柄必须具有进程查询信息或进程查询受限信息访问权限和进程虚拟机读取访问权限

确保在调用
OpenProcess
时请求这些访问权限

处理完手柄后,请使用
CloseHandle
将其关闭。再次仔细阅读文档

请注意,您当前的代码泄漏了您分配的动态内存。实际上不需要动态分配内存。与其声明一个
PPROCESS\u MEMORY\u计数器
,还不如声明一个
PPROCESS\u MEMORY\u计数器
类型的变量。然后可以在堆栈上自动分配内存

最后要指出的一点是,文档还告诉您,如果函数失败,则调用
GetLastError
。请确保您这样做是为了尝试诊断任何故障。

GetProcessMemoryInfo()
为FALSE时,
GetLastError()
返回什么?