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 "tote" Instanzen finden und beenden? (https://www.delphipraxis.net/158900-tote-instanzen-finden-und-beenden.html)

HeikoAdams 7. Mär 2011 12:40

"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-)

HeikoAdams 7. Mär 2011 13:01

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 Delphi-Referenz durchsuchenCreateMutex herausfinden und falls ja, kriege ich ja auch das Handle des Prozesses raus.

Aber wie kann ich prüfen, ob der Prozess tot ist oder nicht?

HeikoAdams 7. Mär 2011 13:14

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;

Meta777 7. Mär 2011 16:42

AW: "tote" Instanzen finden und beenden?
 
huhu,
der code ab " if (h <> 0) then" sollte innerhalb der repeat until loop sein.

shalom

SirThornberry 7. Mär 2011 17:44

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.

Aphton 7. Mär 2011 19:21

AW: "tote" Instanzen finden und beenden?
 
Es kann aber sein, dass es mehrere Instanzen gibt, ausgeschlossen dieser Instanz. Daher ab in die Schleife!

HeikoAdams 8. Mär 2011 07:24

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);

himitsu 8. Mär 2011 07:32

AW: "tote" Instanzen finden und beenden?
 
Wäre ein
Delphi-Quellcode:
until h = 0;
nicht besser?

Und statt dem
Delphi-Quellcode:
Exit
auch noch ein
Delphi-Quellcode:
if ProcessId = 0 then
  Continue;
bzw. bessen auch ein
Delphi-Quellcode:
if ProcessId <> 0 then
begin
  ...
end;

HeikoAdams 8. Mär 2011 08:04

AW: "tote" Instanzen finden und beenden?
 
Zitat:

Zitat von himitsu (Beitrag 1086705)
Wäre ein
Delphi-Quellcode:
until h = 0;
nicht besser?

Nein, weil der Code ja normalerweise mindestens die Instanz, die den Code ausführt, finden sollte :gruebel:

Zitat:

Zitat von himitsu (Beitrag 1086705)
Und statt dem
Delphi-Quellcode:
Exit
auch noch ein
Delphi-Quellcode:
if ProcessId = 0 then
  Continue;
bzw. bessen auch ein
Delphi-Quellcode:
if ProcessId <> 0 then
begin
  ...
end;

Habs ergänzt

himitsu 8. Mär 2011 08:10

AW: "tote" Instanzen finden und beenden?
 
Delphi-Quellcode:
until h = 0;
= solange, bis keine Instanz h mehr gefunden wurde

Delphi-Quellcode:
until h <> 0;
= springe nach der 1. Instanz raus und wenn garnichts gefunden wurde, dann bleib in einer Endlosschleife hängen.


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