Auflisten aller laufenden Prozesse
Zum Auflisten aller laufenden Prozesse gibt es eine Funktion, die einen "Snapshot" der Prozesse macht: CreateToolhelp32Snapshot. Diese Funktion befindet sich, wie auch aus dem Namen zu erschließen, in der
Unit TLHelp32. Sie hat noch verschiedene Funktionen, wie das Auflisten aller Threads oder Module, jedoch sind für uns ja nur die Prozesse von Bedeutung.
Um einen Snapshot zu erstellen ruft man CreateToolhelp32Snapshot so auf:
Delphi-Quellcode:
var
hSnap: THandle;
...
hSnap := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
Der erste Parameter, TH32CS_SNAPPROCESS, gibt an, dass ein Snapshot der laufenden Prozesse gemacht werden soll. Der zweiter Parameter wird ignoriert, er ist nur nötig, wenn die Module oder die Heaplist eines Prozesses herausgefunden werden sollen, dann gibt er nämlich an, von welchem Prozess. CreateToolhelp32Snapshot gibt INVALID_HANDLE_VALUE zurück, wenn die Funktion fehlschlägt. Zum Schluss muss hSnap mit CloseHandle freigegeben werden.
Um nun die einzelnen Prozesse herauszufiltern, gibt es einen Record, ProcessEntry32. Dessen Parameter dwSize muss zuerst mit SizeOf(ProcessEntry32) gefüllt werden, dann kann man ihn benutzen. Um nun in der Liste der Prozesse, im Beispiel oben hSnap, navigieren zu können gibt es mehrere Funktionen, ähnlich FindFirst und FindNext, nämlich Process32First und Process32Next. Mit diesen Funktionen holen wir den ersten Prozess und dann alle folgenden aus hSnap und jeder kommt jeweils in ein ProcessEntry32, hier ein Beispiel für die Anwendung:
Delphi-Quellcode:
program ListProc;
uses
Windows, TLHelp32, SysUtils;
var
hSnap: THandle;
ProcEntry: TProcessEntry32;
s: String;
begin
hSnap := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (hSnap <> INVALID_HANDLE_VALUE) then
begin
ProcEntry.dwSize := SizeOf(ProcessEntry32);
if (Process32First(hSnap, ProcEntry)) then
begin
s := ProcEntry.szExeFile;
MessageBox(0, PChar('Process: ' + ExtractFileName(s) + #10#13 +
'Path: ' + ExtractFilePath(s)),
'Process Info', 0);
while Process32Next(hSnap, ProcEntry) do
begin
s := ProcEntry.szExeFile;
MessageBox(0, PChar('Process: ' + ExtractFileName(s) + #10#13 +
'Path: ' + ExtractFilePath(s)),
'Process Info', 0);
end;
end;
end;
CloseHandle(hSnap);
end.
Wie zu sehen, haben Process32First und Process32Next zwei Argumente: das erste ist der Snapshot und das zweite der Record in den der gefundene Prozess geshrieben wird. Beide Funktionen geben im Fehlerfall False zurück, bei Erfolg True.
Wie auch aus dem Beispiel zu erkennen, ist der Parameter szExeFile der Pfad zum Prozess, es gibt aber auch weitere Eigenschaften:
Code:
----------------------------------------------------------------------------------------
| cntUsage | Referenzzähler des Prozesses (ein Prozess existiert so lange, |
| | bis sein Referenzzähler 0 ist) |
----------------------------------------------------------------------------------------
| th32ProcessID | Prozess-ID |
----------------------------------------------------------------------------------------
| th32DefaultHeapID | DefaultHeap-ID |
----------------------------------------------------------------------------------------
| th32ModuleID | Modul-ID |
----------------------------------------------------------------------------------------
| cntThreads | Anzahl der Threads |
----------------------------------------------------------------------------------------
| th32ParentProcessID | ID des Parent-Prozesses |
----------------------------------------------------------------------------------------
| pcPriClassBase | Prozesspriorität |
----------------------------------------------------------------------------------------
Zum Schluss noch einen Dank an
Luckie, durch seine
OpenSource-Software habe ich das hier gelernt.
Naja, dann noch viel Spaß bei rumspielen
.
MfG,
d3g
[edit=Matze][code] durch [delphi]-tags ersetzt und Code formatiert. Mfg, Matze[/edit]
[edit=flomei]Wir "räumen auf", daher Titel geändert... Mfg, flomei[/edit]