Hi, ich bin auf meiner Suche nach Möglichkeiten, mit Delphi laufende Prozesse auszulesen, auf dieses Forum gestoßen, und habe mehrere Implementationen gefunden.
Alle funktionieren mehr oder weniger gut, die folgende funktioniert in sofern am besten, dass sie öfter als nicht nur die Nutzerprozesse "sieht", und ohne weiteres Filtern eine ziemlich "saubere" Liste liefert.
Versuche ich jedoch, an den
Handle heranzukommen (entweder direkt über ProzessHandle, oder über die eingefügte Funktion GetProcessHandleFromID) passiert etwas absonderliches.
Ich erhalte für jede ID das gleiche
Handle. Entferne ich eine der fettgedruckten "Closehandle()" zeilen, so erhalte ich für jeden Prozess eine einzigartigen
Handle, jedoch scheinen diese Handles zerstört zu werden, da bei der nächsten Iteration alle Handles größer sind als vorher.
Ich bin zwar neu hier, wäre aber trotzdem ausgesprochen dankbar, falls mir Jemand helfen könnte.
Hier ist der Quelltext, mehrere Varianten waren diesem sehr ähnlich. Ich weiss leider nicht mehr, wer der Author dieser Implementation ist.
Code:
procedure DoStuff;
function GetProcessHandleFromID(ID: DWORD): THandle;
begin
result := OpenProcess(SYNCHRONIZE, False, ID);
[b]CloseHandle(result);[/b]
end;
var PrIDs : array [0..1000] of DWORD;
PrName : array [0..255] of Char;
Bia : DWORD;
i, PrCount : Integer;
ProzessHandle : HWND;
Modulhandle : HWND;
begin
PList:=TStringList.Create;
HList:=TStringList.Create;
if EnumProcesses(@PrIDs, SizeOf(PrIDs), bia) then begin
if (Bia < sizeof(PrIDs)) then begin
PrCount:=Bia div SizeOf(DWORD);
for i:=0 to PrCount do begin
ProzessHandle:=OpenProcess(PROCESS_QUERY_INFORMATION or
PROCESS_VM_READ, False, PrIDs[i]);
if (ProzessHandle <> 0) then begin
EnumProcessModules(ProzessHandle,
@ModulHandle,
SizeOf(modulhandle),
Bia);
GetModuleFilenameEx(Prozesshandle,
ModulHandle,
PrName,
SizeOf(PrName));
PList.Add(ExtractFileName(PrName));
HList.Add(IntToStr(GetProcesshandleFromID(PrIDs[i])));
[b] CloseHandle(ProzessHandle);[/b]
end;
end; {for i}
end else begin
MessageDlg('PrID-Array zu klein', mtError, [mbOk], 0)
end;
end else begin
RaiseLastOSError();
end;
end;