我正在尝试编写一个小实用程序来检索计算机上正在运行的进程列表以及每个进程正在使用的内存。
到目前为止,我有以下 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 机器上运行它。
提前致谢,
古德芬努尔·克里斯蒂扬松
最佳答案
您应该阅读 documentation小心。第一个参数是进程句柄而不是进程 ID。您需要调用OpenProcess
从进程 ID 中获取进程句柄。该文件还说:
The handle must have the PROCESS_QUERY_INFORMATION or PROCESS_QUERY_LIMITED_INFORMATION access right and the PROCESS_VM_READ access right.
确保在调用
OpenProcess
时请求这些访问权限.处理完 handle 后,用
CloseHandle
关闭它.再次,仔细阅读文档。请注意,您当前的代码会泄漏您分配的动态内存。实际上不需要动态分配内存。而不是声明
PPROCESS_MEMORY_COUNTERS
,指向结构的指针,声明类型为 PPROCESS_MEMORY_COUNTERS
的变量.然后可以在堆栈上自动分配内存。最后要说明的一点是,文档还告诉您调用
GetLastError
。如果函数失败。请确保您这样做是为了尝试诊断任何故障。
关于delphi - Delphi无法检索进程内存使用情况,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24851125/