To ci powinno co nieco pomóc...
Jak pobrać listę odpalonych procesów wraz z pamięcia jaką zajmują ?
Na przykladzie prostego programu
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
ListBox1: TListBox;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ private declarations }
function GetMemoryString(ProcessID : DWord;var MemoryString: string):Boolean;
function BuildList(List: TStrings): Boolean;
public
{ public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
uses
PsAPI;//Windows NT,2k,XP
function TForm1.GetMemoryString(ProcessID : DWord;var MemoryString: string):Boolean;
var
Bytes, Blocks,
TaskManWS, TaskManVM: Cardinal;
PMC: TProcessMemoryCounters;
const
KiloByte = 1024;
MegaByte = KiloByte * KiloByte;
begin
begin
Result := Win32Check(GetProcessMemoryInfo(ProcessID, @PMC, SizeOf(PMC)));
TaskManWS := PMC.WorkingSetSize;
MemoryString := Format(
'%.0n ($%x) bytes, %.0n ($%x) kb, %.2n ($%x) Mb',
[TaskManWS * 1.0, TaskManWS,
TaskManWS / KiloByte, TaskManWS div KiloByte,
TaskManWS / MegaByte, TaskManWS div MegaByte]);
end;
end;
function TForm1.BuildList(List: TStrings): Boolean;
var
PIDs: array[0..1024] of DWORD;
Handle: THandle;
Needed: DWORD;
i: integer;
ModuleFileName: array[0..MAX_PATH] of char;
ListIndex: Integer;
MemoryString: string;
begin
if (Win32Platform = VER_PLATFORM_WIN32_NT) and
(Win32MajorVersion > 3) then
begin
Result := EnumProcesses(@PIDs, Sizeof(PIDs), Needed);
if Result then
begin
for i := 0 to (Needed div Sizeof(DWORD)) - 1 do
begin
if PIDs[i] <> 0 then
begin
Handle := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ,
False, PIDs[I]);
if Handle <> 0 then
begin
if GetModuleFileNameEx(Handle, 0, ModuleFileName,
Sizeof(ModuleFileName)) <> 0 then
begin
GetMemoryString(Handle,MemoryString);
List.Add(ModuleFileName+ ' - ' + MemoryString);
end;
end; // if Handle
CloseHandle(Handle);
end; // if PIDs[i]
end; // for
end; // if Result
end
else
Result := False;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
BuildList(ListBox1.Items);
end;
end.
Chciałbym dodać, że PSAPI ma zastosowanie w Windows NT. W Windows 9x należy korzystać z pakietu tlhelp32.