Einzelnen Beitrag anzeigen

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, 13: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 13:17 Uhr)
  Mit Zitat antworten Zitat