Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Mehrfachstart einer .exe verhindern (https://www.delphipraxis.net/90941-mehrfachstart-einer-exe-verhindern.html)

ferby 26. Apr 2007 11:08


Mehrfachstart einer .exe verhindern
 
Hallo,

ich habe hier vor langer Zeit ein Thread gefunden, dass meine Frage schon beantwortet hat, leider finde ich es nicht mehr :-(

Also: Ich möchte das meine exe nur einmal gestartet werden kann, wie realiziere ich das?
Bzw. weiß Jemand welches Post das war, welches diese Frage schon beantwortet hat?


Gruß,
Ferby

bitsetter 26. Apr 2007 11:17

Re: Mehrfachstart einer .exe verhindern
 
Hi,
such doch mal nach Mutex
Mutex und Programm nicht doppelt starten

matashen 26. Apr 2007 11:19

Re: Mehrfachstart einer .exe verhindern
 
Den Link fand ich auch nimmer aber ich kopier mir immer interessante Sachen in Textdateien

das hatte hier mal Lemmy geschrieben

Zitat:

Manchmal möchte man nicht, dass das selbst erstellte Programm mehrmals gestartet werden kann, denn zum einen sieht es nicht unbedingt schön aus, wenn die Taskleiste voll mit der gleichen Anwendung ist, andererseits können auch Probleme entstehen, wenn mehrere gleiche Programme auf die selben Resourcen (Dateien, Speicherbereiche, Geräte, ...) zugreifen.
Man kann nun veranlassen, dass das eigene Programm beim Start prüft, ob das selbe bereits läuft. Ist das der Fall, dann wird das 2. (gleiche) Programm gar nicht erst zu Ende gestartet, sondern wieder beendet.
Im folgenden Beispiel wird ein sog. Mutex verwendet, damit Windows dein Programm identifizieren kann. Wird bei einem 2. Startversuch dann ein Mutex mit dem gleichen Namen verwendet, lässt Windows dies nicht zu und das Programm wird nicht geladen.
Durchführung:
Lass über das Menü: Ansicht > Units (oder STRG+F12) den Quelltext des Projektes anzeigen und verändere ihn, dass er dem folgenden entspricht. Allerdings solltest du die vorhandenen Namen der Forms beibehalten:
Delphi-Quellcode:
program Project1;
uses Forms,Windows,
Unit1 in 'Unit1.pas' {Form1};
//-->hier stehen deine Namen der Forms bzw. Units {$R *.RES}
const
  MutexName = 'Mein Programm';
//-->quasi der Name, unter dem Windows dein Programm anspricht
var
  hMutex: THandle; begin
  hMutex := CreateMutex(NIL, True, MutexName);
//-->Versuch, dem Programm den obigen Mutex zuzuweisen
  if (hMutex = 0) OR (GetLastError = ERROR_ALREADY_EXISTS) then
  begin
    CloseHandle(hMutex);
    halt;
  end;
//hat es nicht geklappt, dann wird das Programm
//gar nicht erst initialisiert (also nicht gestartet)
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
  CloseHandle(hMutex);
end.

ferby 26. Apr 2007 11:20

Re: Mehrfachstart einer .exe verhindern
 
Hallo,

danke super

CCRDude 26. Apr 2007 12:30

Re: Mehrfachstart einer .exe verhindern
 
Die Mutex-Variante ist allerdings blöd, wenn ein Programm mal abstürzt und der Mutex dann nicht richtig gelöscht wird - dann lässts sich gar nicht mehr starten ;) Gerade beim Debuggen ist der Griff zu Ctrl+F2 ja manchmal verlockend, weil so schön abkürzend.

Ich hab hier in meinem Blog noch Alternativen genannt; wenn es um eine GUI-Anwendung geht und diese ein Hauptfenster hat, finde ich FindWindow auf die Fensterklasse (da muss man natürlich nen eindeutigeren Namen als TForm1 wählen) noch am praktischsten, weil es direkt das Handle gibt, das man für SetForegroundWindow verwenden kann (somit halt das zweite Starten das Original auch noch gleich in den Vordergrund).


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