AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Lazarus (IDE) Prüfen ob ein Prozess (noch) existiert
Thema durchsuchen
Ansicht
Themen-Optionen

Prüfen ob ein Prozess (noch) existiert

Ein Thema von Moombas · begonnen am 21. Okt 2021 · letzter Beitrag vom 22. Okt 2021
Antwort Antwort
Benutzerbild von Moombas
Moombas

Registriert seit: 22. Mär 2017
Ort: bei Flensburg
525 Beiträge
 
FreePascal / Lazarus
 
#1

Prüfen ob ein Prozess (noch) existiert

  Alt 21. Okt 2021, 13:40
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.
Der Weg ist das Ziel aber man sollte auf dem Weg niemals das Ziel aus den Augen verlieren.
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.508 Beiträge
 
Delphi 7 Professional
 
#2

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

  Alt 21. Okt 2021, 14:16
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;
  Mit Zitat antworten Zitat
Benutzerbild von Moombas
Moombas

Registriert seit: 22. Mär 2017
Ort: bei Flensburg
525 Beiträge
 
FreePascal / Lazarus
 
#3

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

  Alt 21. Okt 2021, 14:58
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.
Der Weg ist das Ziel aber man sollte auf dem Weg niemals das Ziel aus den Augen verlieren.

Geändert von Moombas (21. Okt 2021 um 15:04 Uhr)
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.508 Beiträge
 
Delphi 7 Professional
 
#4

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

  Alt 21. Okt 2021, 15:09
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.
  Mit Zitat antworten Zitat
Delphi-Laie

Registriert seit: 25. Nov 2005
1.474 Beiträge
 
Delphi 10.1 Berlin Starter
 
#5

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

  Alt 21. Okt 2021, 15:16
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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#6

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

  Alt 21. Okt 2021, 16:46
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.
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von Moombas
Moombas

Registriert seit: 22. Mär 2017
Ort: bei Flensburg
525 Beiträge
 
FreePascal / Lazarus
 
#7

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

  Alt 22. Okt 2021, 09:54
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.
Der Weg ist das Ziel aber man sollte auf dem Weg niemals das Ziel aus den Augen verlieren.

Geändert von Moombas (22. Okt 2021 um 09:57 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#8

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

  Alt 22. Okt 2021, 10:33
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.
MerkenZumPrüfenMitGetExitCodeProcess := PIf.hProcess; anstatt 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)
$2B or not $2B

Geändert von himitsu (22. Okt 2021 um 10:41 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:28 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