【问题标题】:Unable to retrieve process memory usage DelphiDelphi无法检索进程内存使用情况
【发布时间】:2014-07-20 13:47:03
【问题描述】:

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

到目前为止,我有以下 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;

我成功检索了“ExeName”和“PID”,但是当我执行 GetProcessMemoryInfo 函数时,调用返回“false”。

对我的代码有什么问题有任何想法吗? 我在 32 位 Windows 7 机器上运行它。

提前致谢,

古德芬努尔·克里斯蒂安森

【问题讨论】:

  • GetProcessMemoryInfo() 得到 FALSE 时,GetLastError() 会返回什么?

标签: delphi winapi


【解决方案1】:

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

句柄必须具有 PROCESS_QUERY_INFORMATION 或 PROCESS_QUERY_LIMITED_INFORMATION 访问权限和 PROCESS_VM_READ 访问权限。

确保您在致电OpenProcess 时请求这些访问权限。

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

请注意,您当前的代码会泄漏您分配的动态内存。实际上不需要动态分配内存。与其声明一个PPROCESS_MEMORY_COUNTERS,指向该结构的指针,不如声明一个PPROCESS_MEMORY_COUNTERS 类型的变量。然后内存就可以自动在栈上分配了。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-06
    • 1970-01-01
    • 1970-01-01
    • 2021-11-19
    • 2010-10-19
    • 2016-05-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多