![]() |
Re: Verhindern eine Anwendung mehrfach zu starten
Zitat:
wenn man sich durchgelesen hat was createMutex macht, dann versuchst Du wenn mHandle = Null ist die Aplikation mit dem Handle in den Vordergrund zu setzen. Solltest Du nicht das Handle der bereits laufenden Aplikation ermitteln und diese dann in den Vordergrund setzten? Zitat:
Klaus |
Re: Verhindern eine Anwendung mehrfach zu starten
Moin, Moin,
vielleicht kann die Suche nach einer Lösung abgekürzt werden. Ich verwende seit Jahren mit Erfolg folgende Unit...
Delphi-Quellcode:
unit rzM_OneInstanceOnly;
// Unit lediglich in das Projekt aufnehmen, danach werden mehrere Instanzen // des Programmes unterbunden; bei erneutem Aufruf wird automatisch die // erste Instanz aktiviert. interface { ----------------------------------------------------------------- } implementation { ------------------------------------------------------------ } uses Forms,SysUtils,Windows; var Mutex : THandle; MName : String; h : HWnd; initialization { ------------------------------------------------------------ } MName:=ExtractFileName(ChangeFileExt(Application.ExeName,'_MTX')); Mutex:=CreateMutex(nil,true,pchar(MName)); // Mutex anlegen if GetLastError=ERROR_ALREADY_EXISTS then begin // Fehler, Pgm schon aktiv! h:=0; // vorhandene Instanz suchen repeat h:=Windows.FindWindowEx(0,h,PChar('TApplication'),PChar(Application.Title)) until h<>Application.Handle; if h<>0 then begin // aktivieren Windows.ShowWindow(h,SW_Restore); Windows.SetForegroundWindow(h); end; halt; // und diesen zweiten Aufruf beenden! end; finalization { -------------------------------------------------------------- } ReleaseMutex(Mutex); // Mutex der ersten Instanz wieder freigeben! end. |
Re: Verhindern eine Anwendung mehrfach zu starten
@taaktaak:
Supi!!! Genau so funktioniert das auch. Vielen Dank an alle, die ihre Zellen haben anstrengen müssen. Jetzt habe ich meinen Code so, wie ich es haben möchte. Für alle, die es auch mal brauchen:
Delphi-Quellcode:
unit OneInstance;
interface implementation uses Windows, Forms; var mHandle : THandle; // Mutexhandle h : HWnd; initialization mHandle := CreateMutex(nil,True,'{7A366489-37B0-4E63-81A0-F0BBC281614D}'); if GetLastError=ERROR_ALREADY_EXISTS then begin // Fehler, Pgm schon aktiv! h := 0; // vorhandene Instanz suchen repeat h := Windows.FindWindowEx(0,h,PChar('TApplication'),PChar(Application.Title)) until h<>Application.Handle; if h<>0 then begin // aktivieren Windows.ShowWindow(h,SW_Restore); Windows.SetForegroundWindow(h); end; Halt; // und diesen zweiten Aufruf beenden! end; finalization // ... und Schluß if mHandle <> 0 then CloseHandle(mHandle) end. |
Re: Verhindern eine Anwendung mehrfach zu starten
Moin, Moin.
Schön, dass es funktioniert. Allerdings halte ich das Fragment...
Delphi-Quellcode:
für suboptimal. Warum sollte man hier eine Konstante verwenden? Gibt es nicht ein Durcheinander, wenn zwei unterschiedliche Programme - die beide diese Konstante benutzen - auf diese Art und Weise ihe Vorhandensein prüfen?
CreateMutex(nil,True,'{7A366489-37B0-4E63-81A0-F0BBC281614D}');
Ist vielleicht eine etwas theoretische Situation, aber der Aufwand, statt der Konstanten den veränderten EXE-Namen zu verwenden, ist doch marginal - oder? |
Re: Verhindern eine Anwendung mehrfach zu starten
Hi,
den EXE-Namen würde ich nicht nehmen. Was, wenn zwei Programme gleich heißen? Und eine GUID ist fast ziemlich eindeutig, denn wenn der PC ne Netzwerkkarte hat, wird diese zur GUI-Erzeugung herangezogen, und die MAC sollte eindeutig sein. Und die Uhrzeit spielt auch mit rein. Du wirst wohl nicht zweimal gleichzeitig auf deinem PC ne GUID erstellen? Wenn du also für jedes Programm ne andere GUID nimmst. Kannst ja den EXE-Namen noch zusätzlich reinnehmen und meinetwegen die Zeichen {, - und } rausnehmen, wenn du Angst hast. Mfg FAlter PS: Wie wird eine GUID berechnet, wenn der PC, auf dem sie drauf ist, keine Netzwerkkarte hat? |
Re: Verhindern eine Anwendung mehrfach zu starten
Hallo Falter,
ein interesanter Aspekt! Zugegeben! Wir sind uns doch aber einig darüber, dass eine Konstante, unter der Voraussetzung, dass das ganze eine Unit ist, die bedarfsweise unverändert eingebunden wird, nicht sinnvoll ist? //edit: Noch 'mal nachgedacht! Ich halten dann die Kombination aus ExeName und Länge der Exedatei für ausreichend. Die Wahrscheinlichkeit, dass zwei unterschiedliche Programme die gleiche Länge haben UND einen Mutex anlegen, auf den geprüft wird, dann doch für sehr, sehr unwahrscheinlich - vielleicht gibt's hier ja einen Mathematiker, der die Wahrscheinlichkeit mal ausrechnen möchte? |
Re: Verhindern eine Anwendung mehrfach zu starten
Hi,
ja, bei unverändertem Übernehmen in ein anderes Projekt ist das sehr sinnlos. So gesehen kann ich nur zustimmen. Mir persönlich gefällt übrigens das ![]() Mfg FAlter |
Re: Verhindern eine Anwendung mehrfach zu starten
Application.Exename alleine scheint mir aber nicht "sicher", denn den Namen der Anwendung kann jeder zu jeder zeit ändern.
|
Re: Verhindern eine Anwendung mehrfach zu starten
Jooo, sofort und abschließend überzeugt:
"Halt" fliegt 'raus und wird durch "Terminate" ersetzt - Danke! |
Re: Verhindern eine Anwendung mehrfach zu starten
Hmm, ist in gewisser Weise ein Argument. Obwohl das natürlich schon ein "Sabotage" der Software ist, die auch an anderen Stellen, die viel unangenehmere Auswirkungen haben können, auch Probleme schaffen könnte. Hmm, was ist denn dann die derzeit beste Lösung? Mit der GUID kann ich mich nicht so richtig anfreunden...
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:29 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-2025 by Thomas Breitkreuz