![]() |
"tote" Instanzen finden und beenden?
Hallo,
hat hier jemand eine Idee, wie ich "tote" Instanzen (z.B. nach einem Programmabsturz) meines Programms finden und beenden kann? Eine Suche zu dem Thema bringt nur die Diskussionen, ob Delphi tot ist oder nicht, als Ergebnisse 8-) |
AW: "tote" Instanzen finden und beenden?
Nach ein wenig herum suchen bin ich schon einmal einen Schritt weiter: Ob mein Programm bereits ausgeführt wird kann ich über
![]() Aber wie kann ich prüfen, ob der Prozess tot ist oder nicht? |
AW: "tote" Instanzen finden und beenden?
Hat sich erledigt. Ich habe eine Lösung gefunden:
Delphi-Quellcode:
function TFrmBackup.CheckInstance: Boolean;
var h: HWnd; RetValue: Cardinal; hProcess, ProcessId: THandle; begin Result := True; mutex := 0; //Mutex erzeugen mutex := Windows.CreateMutex(nil, True, PChar(sMutex)); if (GetLastError = ERROR_ALREADY_EXISTS) then begin Result := False; h := 0; //Handle der anderen Instanz suchen repeat h := FindWindowEx(0, h, 'TApplication', PChar(Application.Title)) until (h <> Application.Handle); if (h <> 0) then begin //prüfen, ob die Instanz hängt if (SendMessageTimeOut(h, WM_NULL, 0, 0, SMTO_NORMAL or SMTO_ABORTIFHUNG, 5000, RetValue) = 0) then begin //ProzessId des hängenden Prozesses holen GetWindowThreadProcessId(h, ProcessId); if (ProcessId = 0) then Exit; //hängenden Prozess beenden hProcess := OpenProcess(PROCESS_TERMINATE, False, ProcessId); if (hProcess <> 0) then try TerminateProcess(hProcess, 255); finally CloseHandle(hProcess); end; end; end; end; end; |
AW: "tote" Instanzen finden und beenden?
huhu,
der code ab " if (h <> 0) then" sollte innerhalb der repeat until loop sein. shalom |
AW: "tote" Instanzen finden und beenden?
@HeikoAdams: Bitte unterlasse zukünftig das pushen innerhalb von 24 Stunden.
@Meta777: Nein, der Source stimmt schon so. Er will ja nicht die neu gestartete Instanz beenden sondern eine andere. |
AW: "tote" Instanzen finden und beenden?
Es kann aber sein, dass es mehrere Instanzen gibt, ausgeschlossen dieser Instanz. Daher ab in die Schleife!
|
AW: "tote" Instanzen finden und beenden?
Okay, dann würde die entsprechende Code-Sequenz wohl so aussehen:
Delphi-Quellcode:
repeat
h := FindWindowEx(0, h, 'TApplication', PChar(Application.Title)); if (h <> 0) and (h <> Application.Handle) then begin //prüfen, ob die Instanz hängt if (SendMessageTimeOut(h, WM_NULL, 0, 0, SMTO_NORMAL or SMTO_ABORTIFHUNG, 5000, RetValue) = 0) then begin //ProzessId des hängenden Prozesses holen GetWindowThreadProcessId(h, ProcessId); if (ProcessId = 0) then Continue; //hängenden Prozess beenden hProcess := OpenProcess(PROCESS_TERMINATE, False, ProcessId); if (hProcess <> 0) then try TerminateProcess(hProcess, 255); finally CloseHandle(hProcess); end; end; end; until (h = 0); |
AW: "tote" Instanzen finden und beenden?
Wäre ein
Delphi-Quellcode:
nicht besser?
until h = 0;
Und statt dem
Delphi-Quellcode:
auch noch ein
Exit
Delphi-Quellcode:
bzw. bessen auch ein
if ProcessId = 0 then
Continue;
Delphi-Quellcode:
if ProcessId <> 0 then
begin ... end; |
AW: "tote" Instanzen finden und beenden?
Zitat:
Zitat:
|
AW: "tote" Instanzen finden und beenden?
Delphi-Quellcode:
= solange, bis keine Instanz h mehr gefunden wurde
until h = 0;
Delphi-Quellcode:
= springe nach der 1. Instanz raus und wenn garnichts gefunden wurde, dann bleib in einer Endlosschleife hängen.
until h <> 0;
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:39 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz