Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Lazarus (IDE) (https://www.delphipraxis.net/81-lazarus-ide/)
-   -   Prüfen ob ein Prozess (noch) existiert (https://www.delphipraxis.net/209070-pruefen-ob-ein-prozess-noch-existiert.html)

Moombas 21. Okt 2021 12:40

Prüfen ob ein Prozess (noch) existiert
 
Hi,

ich möchte bei mir etwas umstellen und daher prüfen ob ein Prozess, der aktuell wie folgt gestartet wird,...:
Delphi-Quellcode:
CreateProcessWithLogonW(PWideChar(User), nil, PWideChar(PW), 0, nil, PWideChar(ws), CREATE_DEFAULT_ERROR_MODE, nil, PWideChar(param), @si, @pif) then
sleep(500);
if PIf.dwProcessId > 0 then
begin
  AppPID := PIf.dwProcessId;
  CloseHandle(PIf.hProcess);
  CloseHandle(PIf.hThread);
end;
...noch läuft.
Ich habe Beispiele gefunden, die auf die *.exe abzielen, ich würde aber lieber auf die PID schauen, da eindeutig.
Kann mir da jemand einen Schubser geben? Ich glaube ich sehe den Wald wieder vor lauten Bäumen nicht.

Delphi.Narium 21. Okt 2021 13:16

AW: Prüfen ob ein Prozess (noch) existiert
 
Sowas in der Art?
Delphi-Quellcode:
uses
  TlHelp32;

function FindProcessByPid(const Pid : Cardinal) : Boolean;
var
  hProc, hSnapshot: THandle;
  Pe32: TProcessEntry32;
begin
  Result     := false;
  hSnapshot  := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  Pe32.dwSize := SizeOf(TProcessEntry32);
  if Process32First(hSnapshot, Pe32) then begin
    repeat
      if pe32.th32ProcessID = Pid then begin
        Result := True;
        break;
      end;
    until not Process32Next(hSnapshot, Pe32);
  end;
  CloseHandle(hSnapshot);
end;

Moombas 21. Okt 2021 13:58

AW: Prüfen ob ein Prozess (noch) existiert
 
Sieht vielversprechend aus, schaue ich mir an. Danke schon mal.

Lazarus kennt TlHelp32 nicht, evtl. auch weil ich Lazarus 64bit nutze. Gibts dafür eine Alternative?

ich denke das sollte jwatlhelp32 sein. Teste ich mal.

Delphi.Narium 21. Okt 2021 14:09

AW: Prüfen ob ein Prozess (noch) existiert
 
Wie sehen denn die Routinen aus, die ein Programm über den Namen suchen?

Get list of process

Da wird u. a. 'ne Unit jwaTlHelp32 genutzt.

Aber alle Beispile dort enthalten irgendwo die ProcessID, so dass man die Routinen entsprechend Deinen Wünschen anpassen können dürfte.

Delphi-Laie 21. Okt 2021 14:16

AW: Prüfen ob ein Prozess (noch) existiert
 
Zitat:

Zitat von Moombas (Beitrag 1496412)
Lazarus kennt TlHelp32 nicht, evtl. auch weil ich Lazarus 64bit nutze. Gibts dafür eine Alternative?

ich denke das sollte jwatlhelp32 sein.

Ist es.

Man kann auch mit Lazaruscompilaten die Prozesse einlesen. Siehe meine Programme unter https://www.delphipraxis.net/134360-...-und-mehr.html

himitsu 21. Okt 2021 15:46

AW: Prüfen ob ein Prozess (noch) existiert
 
Wozu suchen?

Es existiert bereits ein Handle, direkt zu dem Prozess.
jedenfalls bis dahin, wo es geschlossen wird. (CloseHandle)


Wie überall zu finden, kann man also auch direkt warten, mit einem WaitForSingleObject/WaitForMultipleObjects vor dem CloseHandle.
https://www.delphipraxis.net/133505-execandwait.html
https://www.delphipraxis.net/194595-...usfuehren.html
uvvvm.


Schließen muß man es aber garnicht (sofort), also statt der ID hebt man sich das Handle auf.

Und so lange kann man mit WaitForSingleObject/WaitForMultipleObjects warten (mit einem ganz kurzen Timeout kann man es auch nutzen, um zu gucken ob es noch läuft)
oder mit GetExitCodeProcess prüfen ob es schon beendet wurde (wenn nicht, dann liefert das ja ein False).


Am Ende natürlich nicht vergessen zu das Handle freizugeben.

Moombas 22. Okt 2021 08:54

AW: Prüfen ob ein Prozess (noch) existiert
 
Danke für die Tipps.
Ggf. bin ich mal wieder zu verbohrt in meiner Denkweise^^

Es geht nur darum ein gestartetes Programm zu überwachen und Aktionen auszuführen wenn es beendet wurde.
Aber das überwachende Programm soll natürlich in der Zeit weiter bedienbar sein.
Daher wollte ich das per Timer + Prüfen ob PID noch existiert im Hintergrund machen.

Ich dachte über die PID wäre das am einfachsten (evtl. weil ich das von AutoIt mittlerweile so gewöhnt bin (ProcessExists($PID)). Aber wenns mit dem Handle einfacher ist, muss ich mir das nochmal durch den Kopf gehen lassen.
Den Timer würde ich später schauen durch ggf. etwas schöneres zu ersetzen, da ich mit Tasks bisher noch nichts gemacht habe.

himitsu 22. Okt 2021 09:33

AW: Prüfen ob ein Prozess (noch) existiert
 
Wie gesagt, einfach das Handle merken und nicht sofort nach dem CreateProcess freigeben.

Mit diesem Handle kann man dann jederzeit direkt prüfen, ohne unnötig umständlich zu suchen, ob der Prozess noch arbeitet.
Delphi-Quellcode:
MerkenZumPrüfenMitGetExitCodeProcess := PIf.hProcess;
anstatt
Delphi-Quellcode:
CloseHandle(PIf.hProcess);
(Letzeres dann machen, wenn man ganz fertig mit Prüfen ist)


PS: Falls pif vorher nicht mit 0 initialisiert wurde, dann ist [DELPHI]if PIf.dwProcessId > 0 then[DELPHI] falsch, denn
Zitat:

Return value

If the function succeeds, the return value is nonzero. To get extended error information, call GetLastError.

If the function fails, the return value is 0 (zero).
und es kann sein, dass im Fehlerfall diese Variable garnicht beschrieben wird.

Delphi-Quellcode:
Result := CreateProcessWithLogonW(PWideChar(User), nil, PWideChar(PW), 0, nil, PWideChar(ws), CREATE_DEFAULT_ERROR_MODE, nil, PWideChar(param), @si, @pif);
if Result <> 0 then
Das Sleep sollte auch unnötig sein. (die Daten in diesem Record werden sich in der Zwischenzeit garantiert nicht ändern)


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:32 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