Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Prüfen mittels PID ob Prozess läuft (https://www.delphipraxis.net/168554-pruefen-mittels-pid-ob-prozess-laeuft.html)

Mohadrim 28. Mai 2012 20:14

Prüfen mittels PID ob Prozess läuft
 
Hallo,

das ganze treibt mich in den Wahnsinn. Ich hab schon einige Beiträge hier durch aber bei mir geht es nicht.

Benötigt: Ich habe eine PID als Integerwert nun möchte ich gerne prüfen, ob der Prozess dazu läuft und hätte gerne ein Ja oder Nein zurück.

Problem: Ich habe einige Sachen ausprobiert wie Beitrag http://www.delphipraxis.net/26833-pr...ng-laeuft.html wenn ich dort

[DELPHI]hProcess := GetProcessHandleFromID(GetProcessID('notepad.exe') );DELPHI]

angeb geht alles gut und er sagt das das Programm läuft. Nur wenn ich die PID direkt übergebe bekomm ich immer ein OK egal ob der Prozess läuft oder nicht obwohl es auch so wie im Beitrags Script ausgeführt wird.

Delphi-Quellcode:
...
var myHandle: THandle;
begin
myHandle := OpenProcess(SYNCHRONIZE, False, myID);
if myHandle <> 0 then
Label1.Caption := 'ok'
else
Label1.Caption := 'no';
...


Die PID stimmt definitiv und wäre auch die gleiche die im oberen Script (Link) gesagt wird.
Kann mir da jemand helfen? Wie gesagt ich will nur eine PID Abfragen und den Status bekommen mehr nicht.

Luckie 28. Mai 2012 20:28

AW: Prüfen mittels PID ob Prozess läuft
 
Und wo bekommst du die PID nachher her? Und was sagt GetLastError im Fehlerfall?

BUG 28. Mai 2012 20:37

AW: Prüfen mittels PID ob Prozess läuft
 
Du überprüfst nicht, ob ein Prozess mit der PID läuft, sondern prüfst ob diese Null ist. Wenn du sie auf einen bestimmten Wert setzt, ist sie das natürlich nie.

Außerdem sind ein Handle und eine PID auch unterschiedliche Sachen.

In dem verlinktem Beitrag ist folgender Teil interessant:
Delphi-Quellcode:
function GetProcessID(Exename: string): DWORD;
var
  hProcSnap: THandle;
  pe32: TProcessEntry32;
begin
  result := 0;
  hProcSnap := CreateToolHelp32SnapShot(TH32CS_SNAPPROCESS, 0);
  if hProcSnap <> INVALID_HANDLE_VALUE then
  begin
    pe32.dwSize := SizeOf(ProcessEntry32);
    if Process32First(hProcSnap, pe32) = true then
    begin
      while Process32Next(hProcSnap, pe32) = true do // gehe durch alle Prozesse
      begin
        if pos(Exename, pe32.szExeFile) <> 0 then
          result := pe32.th32ProcessID; // die Prozess ID wird zurückgegeben
      end;
    end;
    CloseHandle(hProcSnap);
  end;
end;
PS: @Luckie:
Wäre es so rum nicht richtiger:
Delphi-Quellcode:
 if Process32First(hProcSnap, pe32) then
    begin
      repeat // gehe durch alle Prozesse
        if pos(Exename, pe32.szExeFile) <> 0 then
          result := pe32.th32ProcessID; // die Prozess ID wird zurückgegeben
      until Process32Next(hProcSnap, pe32);
    end;

jaenicke 28. Mai 2012 21:21

AW: Prüfen mittels PID ob Prozess läuft
 
Wobei das so eigentlich kaum einen Sinn macht. Die Process ID ist Schall und Rauch, da diese nach der Beendigung eines Prozesses auch wieder vergeben wird. Ob also der Prozess noch läuft, zu dem die ID ursprünglich gehörte, oder ein neuer mit dieser ID, lässt sich aus der ID nicht feststellen.

Man kann vielleicht zusätzlich vergleichen wann der Prozess gestartet wurde um eine bestimmte Instanz zu prüfen.

Bbommel 29. Mai 2012 10:01

AW: Prüfen mittels PID ob Prozess läuft
 
Hm, nehmen wir mal an, es macht einen Sinn - ich konnte das gewünschte hier nachbauen und es läuft ohne Probleme:

Delphi-Quellcode:
procedure TForm2.Button2Click(Sender: TObject);

var myID: integer;
  hProcess: THandle;

begin
  myID:=strToInt(edit1.Text);
  hProcess := GetProcessHandleFromID(myID);
  if hProcess = 0 then
    Label1.Caption := 'Programm läuft nicht'
  else
    Label1.Caption := 'Programm läuft';
end;
Hier liegt nur ein Edit auf dem Formular, in dem man eine ID manuell eingeben kann (die man vorher über einen anderen Button sich anzeigen lassen kann). Ein Klick auf Button2 löst obige Prozedur aus. Ich habe das dann mit dem Notepad++ getestet und seine aktuelle Prozess-ID angegeben. Das Programm hat mir gesagt, dass er läuft. Dann habe ich den Notepad++ beendet und bekam die Meldung, dass er nicht mehr läuft. Alles gut also.

Will sagen: wenn du die Funktionen von Luckie so aufrufst, funktioniert das wie von dir gewünscht gewünscht. Das Problem müsste in der Tat irgendwo anders liegen. Vielleicht steht in deiner Variable zum Zeitpunkt des Aufrufs der falsche Wert, denn was vorher mit der passiert, wissen wir ja nicht. :)

Bis denn
Bommel

BUG 29. Mai 2012 11:56

AW: Prüfen mittels PID ob Prozess läuft
 
Zitat:

Zitat von Bbommel (Beitrag 1168486)
ich konnte das gewünschte hier nachbauen und es läuft ohne Probleme

Funktioniert das auch bei Prozessen ohne Fenster, also z.B. bei Kommandozeilenprogrammen?

Bbommel 29. Mai 2012 12:16

AW: Prüfen mittels PID ob Prozess läuft
 
Zitat:

Zitat von BUG (Beitrag 1168530)
Zitat:

Zitat von Bbommel (Beitrag 1168486)
ich konnte das gewünschte hier nachbauen und es läuft ohne Probleme

Funktioniert das auch bei Prozessen ohne Fenster, also z.B. bei Kommandozeilenprogrammen?

Jepp. Gerade mit einem in einer Eingabeaufforderung gestarteten Telnet-Client getestet.

Mohadrim 20. Jun 2012 08:11

AW: Prüfen mittels PID ob Prozess läuft
 
Okay hab nun noch mal alles neu eingefügt und siehe da es geht. Danke nochmal.

stahli 20. Jun 2020 21:42

AW: Prüfen mittels PID ob Prozess läuft
 
Ich prüfe auf diesem Weg, ob die bds.exe (also Delphi) läuft.

Das funktioniert auch.

Aber kann ich noch den Pfad der Exe ermitteln, um auf eine bestimmte Version zu prüfen?

Im Taskmanager kann man über Rechtsklick auch "Dateipfad öffnen" auswählen.
Kommt man an die Info heran?

himitsu 20. Jun 2020 21:47

AW: Prüfen mittels PID ob Prozess läuft
 
z.B. die Toolhelp-APIs
MSDN-Library durchsuchenProcess32First

oder via WMI


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:26 Uhr.
Seite 1 von 2  1 2      

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