AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi "tote" Instanzen finden und beenden?
Thema durchsuchen
Ansicht
Themen-Optionen

"tote" Instanzen finden und beenden?

Ein Thema von HeikoAdams · begonnen am 7. Mär 2011 · letzter Beitrag vom 8. Mär 2011
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von HeikoAdams
HeikoAdams

Registriert seit: 12. Jul 2004
Ort: Oberfranken
661 Beiträge
 
FreePascal / Lazarus
 
#1

"tote" Instanzen finden und beenden?

  Alt 7. Mär 2011, 13:40
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
Jeder kann ein Held werden und Leben retten!
Einfach beim NKR oder der DKMS als Stammzellenspender registrieren! Also: worauf wartest Du noch?
  Mit Zitat antworten Zitat
Benutzerbild von HeikoAdams
HeikoAdams

Registriert seit: 12. Jul 2004
Ort: Oberfranken
661 Beiträge
 
FreePascal / Lazarus
 
#2

AW: "tote" Instanzen finden und beenden?

  Alt 7. Mär 2011, 14:01
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?
Jeder kann ein Held werden und Leben retten!
Einfach beim NKR oder der DKMS als Stammzellenspender registrieren! Also: worauf wartest Du noch?
  Mit Zitat antworten Zitat
Benutzerbild von HeikoAdams
HeikoAdams

Registriert seit: 12. Jul 2004
Ort: Oberfranken
661 Beiträge
 
FreePascal / Lazarus
 
#3

AW: "tote" Instanzen finden und beenden?

  Alt 7. Mär 2011, 14:14
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;
Jeder kann ein Held werden und Leben retten!
Einfach beim NKR oder der DKMS als Stammzellenspender registrieren! Also: worauf wartest Du noch?

Geändert von HeikoAdams ( 7. Mär 2011 um 14:17 Uhr)
  Mit Zitat antworten Zitat
Meta777

Registriert seit: 8. Sep 2004
Ort: Magdeburg
248 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: "tote" Instanzen finden und beenden?

  Alt 7. Mär 2011, 17:42
huhu,
der code ab " if (h <> 0) then" sollte innerhalb der repeat until loop sein.

shalom
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#5

AW: "tote" Instanzen finden und beenden?

  Alt 7. Mär 2011, 18:44
@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.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's

Geändert von SirThornberry ( 7. Mär 2011 um 18:47 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Aphton
Aphton

Registriert seit: 31. Mai 2009
1.198 Beiträge
 
Turbo Delphi für Win32
 
#6

AW: "tote" Instanzen finden und beenden?

  Alt 7. Mär 2011, 20:21
Es kann aber sein, dass es mehrere Instanzen gibt, ausgeschlossen dieser Instanz. Daher ab in die Schleife!
das Erkennen beginnt, wenn der Erkennende vom zu Erkennenden Abstand nimmt
MfG
  Mit Zitat antworten Zitat
Benutzerbild von HeikoAdams
HeikoAdams

Registriert seit: 12. Jul 2004
Ort: Oberfranken
661 Beiträge
 
FreePascal / Lazarus
 
#7

AW: "tote" Instanzen finden und beenden?

  Alt 8. Mär 2011, 08:24
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);
Jeder kann ein Held werden und Leben retten!
Einfach beim NKR oder der DKMS als Stammzellenspender registrieren! Also: worauf wartest Du noch?

Geändert von HeikoAdams ( 8. Mär 2011 um 09:16 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: "tote" Instanzen finden und beenden?

  Alt 8. Mär 2011, 08:32
Wäre ein until h = 0; nicht besser?

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

Geändert von himitsu ( 8. Mär 2011 um 08:35 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von HeikoAdams
HeikoAdams

Registriert seit: 12. Jul 2004
Ort: Oberfranken
661 Beiträge
 
FreePascal / Lazarus
 
#9

AW: "tote" Instanzen finden und beenden?

  Alt 8. Mär 2011, 09:04
Wäre ein until h = 0; nicht besser?
Nein, weil der Code ja normalerweise mindestens die Instanz, die den Code ausführt, finden sollte

Und statt dem 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
Jeder kann ein Held werden und Leben retten!
Einfach beim NKR oder der DKMS als Stammzellenspender registrieren! Also: worauf wartest Du noch?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: "tote" Instanzen finden und beenden?

  Alt 8. Mär 2011, 09:10
until h = 0; = solange, bis keine Instanz h mehr gefunden wurde

until h <> 0; = springe nach der 1. Instanz raus und wenn garnichts gefunden wurde, dann bleib in einer Endlosschleife hängen.
$2B or not $2B

Geändert von himitsu ( 8. Mär 2011 um 09:34 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 06:03 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