Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   GetExitCodeProcess richtig verwenden (https://www.delphipraxis.net/156140-getexitcodeprocess-richtig-verwenden.html)

Luckie 21. Nov 2010 15:47

GetExitCodeProcess richtig verwenden
 
Ich habe hier mal eine Funktion implementiert, die überprüft, ob ein Prozess beendet wurde:
Delphi-Quellcode:
function TKillProcess.HasProcessTerminated: Boolean;
var
  ProcessHandle: Cardinal;
  ProcessExitCode: DWORD;
const
  PROCESS_QUERY_LIMITED_INFORMATION = $1000;
begin
  Result := False;
  ProcessHandle := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_QUERY_LIMITED_INFORMATION, False, FProcessID);
  if ProcessHandle <> 0 then
  begin
    if GetExitCodeProcess(ProcessHandle, ProcessExitCode) then
    begin
      case ProcessExitCode of
        STILL_ACTIVE: Result := False;
      else
        Result := True;
      end;
    end
    else
    begin
      RaiseLastOSError;
    end;
    CloseHandle(ProcessHandle);
  end
  else
  begin
    RaiseLastOSError;
  end;
end;
Funktioniert das so zuverlässig oder hab eich da was übersehen?

DeddyH 21. Nov 2010 16:02

AW: GetExitCodeProcess richtig verwenden
 
Wenn ich den MSDN-Artikel richtig verstanden habe, sollte das so richtig sein. Allerdings könnte man das IMO noch kürzen:
Delphi-Quellcode:
if GetExitCodeProcess(ProcessHandle, ProcessExitCode) then
    begin
      Result := ProcessExitCode <> STILL_ACTIVE;
    end
    else
    begin
      RaiseLastOSError;
    end;

Assarbad 21. Nov 2010 16:02

AW: GetExitCodeProcess richtig verwenden
 
Ich denke mal, daß das CloseHandle eher in einem finally-Block stehen sollte. Ansonsten bleibt die Referenz nämlich im Fehlerfall.

Sonst sehe ich auf Anhieb keine Probleme.

Allerdings ist die beste Methode das zu ermitteln was du willst noch immer MSDN-Library durchsuchenWaitForSingleObject.

Luckie 21. Nov 2010 16:06

AW: GetExitCodeProcess richtig verwenden
 
Ok, danke fürs drübergucken.

rollstuhlfahrer 21. Nov 2010 16:08

AW: GetExitCodeProcess richtig verwenden
 
Nun ja, die Zuverlässigkeit ist nicht 100%ig gegeben. In MSDN steht nämlich auch drin, dass man als Programmierer es möglichst vermeiden sollte, die Konstante STILL_ACTIVE als Exitcode zu setzen. Nimmt man jetzt eine zufällige Verteilung der Exitcodes an, ist das 2^-32*100%.

Ist es nicht sicherer, sich einen Process-Snapshot zu besorgen und mit Hilfe von FirstProcess()/NextProcess() den Prozess zu suchen? Wenn er da nicht dabei ist, lebt er auch nicht mehr. Das sollte reichen, weil die ProcessID nun mal während der gesamten Laufzeit seit dem letzten Neustart einmalig sind.

Bernhard

Assarbad 21. Nov 2010 16:11

AW: GetExitCodeProcess richtig verwenden
 
Oder man benutzt MSDN-Library durchsuchenWaitForSingleObject wie es von Alters her üblich ist :zwinker:

Sowohl Threads als auch Prozesse werden signalisiert wenn sie beendet wurden.

Luckie 21. Nov 2010 16:12

AW: GetExitCodeProcess richtig verwenden
 
Könnte man natürlich auch machen. dann könnte man auch gleichzeitig einbauen mehrere gleichnamige Prozesse zu beenden, wie es schon vorgeschlagen wurde.


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