Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Software-Projekte der Mitglieder (https://www.delphipraxis.net/26-software-projekte-der-mitglieder/)
-   -   EnumProcesses (https://www.delphipraxis.net/97307-enumprocesses.html)

Luckie 8. Aug 2007 11:26


EnumProcesses
 
Liste der Anhänge anzeigen (Anzahl: 2)
EnumProcesses
Aktuelle Version: 1.0.0.17

Eigentlich wollte ich nur alten Code von mir sauber in eine Klasse kapseln, allerdings ist dann das Testprogramm doch ganz brauchbar geworden, wie ich denke.

EnumProcesses listet alle Processes im System auf und kann optional folgende Informationen anzeigen:
  1. ProzessID
  2. ProzessID des Eltrenprozesses
  3. Dateiname des Prozesses
  4. Dateiname inklusive Pfad des Prozesses
  5. Besitzer des Prozesse
  6. Basis Prioritätsklasse
  7. Anzahl der Threads eines Prozesses
  8. Anzahl der geladenen Module eines Prozesses
  9. Zeitstempel wann der Prozess erzeugt wurde
  10. CPU Nutzung des Prozesses
Wird das Programm ohne Parameter aufgerufen, werden die PID, der Dateiname und der Besitzer ausgegeben.

Mit dem Parameter /k:<PID> kann der Prozess mit der angegebenen ProzessID beendet werden.

Übersicht über die möglichen Kommandozeilenparamter:
Code:
Commandline switches:
        /I: ProcessID
        /J: Parent process ProcessID
        /F: Filename
        /P: Path inclusive filename
        /O: Process owner
        /C: Base priority class
        /T: Thread count
        /M: Module count
        /T: Createtime of process
        /U: CPU usage time
        /K:<PID>: Kill process with the given PID

shmia 8. Aug 2007 13:07

Re: EnumProcesses
 
Der Code für function FormatW und function SysErrorMessage kommt zweimal vor. Das könnte man z.B. in eine eigene Unit namens SysUtilsNonVcl auslagern.

Luckie 8. Aug 2007 13:12

Re: EnumProcesses
 
Ich weiß. Normalerweise benutze ich dazu auch meine Unit MpuTools.pas. Aber weil ich nur ein paar wenige Funktionen brauchte, habe ich die mir nur rauskopiert.

Nakaron 29. Aug 2007 11:30

Re: EnumProcesses
 
Hi Luckie,

ist es auch möglich mit deiner Unit die CPU Auslastung herauszubekommen je Prozess?
Momentan gibts ja nur die länge der CPU Nutzung.


Beste Grüße
Nakaron

Luckie 29. Aug 2007 11:40

Re: EnumProcesses
 
Nein, aber die kannst du dir ja selber ausrechnen anhand der CPU-Zeit.

Nakaron 29. Aug 2007 12:11

Re: EnumProcesses
 
Ich nehme mal an das ich die CPU Auslastung aus folgendem Code ausrechnen kann oder?

Delphi-Quellcode:
function PrintCPUTime(Process: TProcess): WideString;
var
  KernelTime64      : LARGE_INTEGER; //TFileTime;
  UserTime64        : LARGE_INTEGER;
  CPUTime64         : LARGE_INTEGER;
  CPUTimeft        : TFileTime;
  st               : TSystemTime;
  TimeStr          : array[0..254] of WideChar;
  Kernel, User     : Cardinal;
  dwTime           : DWORD;
begin
  KernelTime64.LowPart := Process.KernelTime.dwLowDateTime;
  KernelTime64.HighPart := Process.KernelTime.dwHighDateTime;
  UserTime64.LowPart := Process.UserTime.dwLowDateTime;
  UserTime64.HighPart := Process.UserTime.dwHighDateTime;
  CPUTime64.QuadPart := KernelTime64.QuadPart + UserTime64.QuadPart;
  CPUTimeft.dwLowDateTime := CPUTime64.LowPart;
  CPUTimeft.dwHighDateTime := CPUTime64.HighPart;
  FileTimeToSystemTime(CPUTimeft, st);
  GetTimeFormatW(LOCALE_SYSTEM_DEFAULT, TIME_FORCE24HOURFORMAT, @st, nil, TimeStr, SizeOf(TimeStr));
  Result := WideString(TimeStr);
end;
Ich habe mit den Werten von KernelTime64, UserTime64, CPUTime64 und CPUTimeft schon etwas rumprobiert. Da ich mich allerdings damit nicht auskenne, habe ich es bisher noch nicht rausbekommen.

Könntest du mir vielleicht einen Denkanstoß geben?

Beste Grüße
Nakaron

h.slomka 17. Okt 2007 12:09

Re: EnumProcesses
 
Hallo Luckie,

ich glaube, ich habe ein Memory-Leak in Deinem Code gefunden.
In folgender Funktion aus den MPUProcessTools:

Delphi-Quellcode:
function SidToString(ASID: PSID): WideString;
var
  sDummy           : PWideChar;
begin
  ConvertSidToStringSid(ASID, sDummy);
  Result := string(sDummy);
end;
Wird der zurückgegebene Buffer nicht freigegeben.

Delphi-Quellcode:
LocalFree(Cardinal(sDummy));

Gruß

Delphi-Laie 25. Dez 2009 17:41

Re: EnumProcesses
 
Hallo Luckie, zunächst einmal: feines Programm!

Aber eines kann ich nicht nachvollziehen: Mit Deinem Programm kann man so ziemlich alles beenden, jedenfalls auch einige der Systemprozesse, die auch der ProcessExplorer der Sysinternals abgeschossen bekommt. Verwende ich die m.E. relevanten Befehle zum Beenden der Prozesse, komme ich jedoch nur auf gewöhnliche Beendbarkeit, wie sie auch der Taskmanager bietet: Systemprozesse bleiben unantastbar.

Meine „Forschungen“ sind inzwischen soweit gediegen (oder gediehen), daß bei mir mit diesem Befehl

Delphi-Quellcode:
hProcess:=OpenProcess(SYNCHRONIZE or PROCESS_TERMINATE,False,PID)
, auf Systemprozesse angewandt, hProcess gleich Null ist. Also, irgendetwas ist bei meinem simplen Aufruf anders als in Deinem Programm.


Darf ich Dich vorsichtig fragen, welches - von mir leider bisher nicht erkannte - Geheimnis Dein Programm beherbergt, daß es auch die meisten Systemprozesse terminieren kann?

Gruß

Delphi-Laie


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:53 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz