Delphi-PRAXiS
Seite 4 von 6   « Erste     234 56      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Verhindern eine Anwendung mehrfach zu starten (https://www.delphipraxis.net/113334-verhindern-eine-anwendung-mehrfach-zu-starten.html)

Klaus01 6. Mai 2008 15:23

Re: Verhindern eine Anwendung mehrfach zu starten
 
Zitat:

Zitat von Moony
Klar, dass die Unit umbenannt wird. Wurde nur vorerst zum Test angelegt und gespeichert.

Habe mir die Funktion "EnsureSingleInstance" angeschaut. Theoretisch muß ich nicht die ganzen Überprüfungen machen. Was das eigentliche in dieser Funktion betrifft, führe ich ja bei mir aus. Sprich:
Delphi-Quellcode:
mHandle := CreateMutex(nil,True,'{7A366489-37B0-4E63-81A0-F0BBC281614D}');
...
SetForegroundWindow(mHandle);
BringWindowToTop(mHandle);
Aber leider wird das Programm immer noch nciht in den Vordergrund gesetzt.

Hallo,

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:

Zitat von msdn2
If the function succeeds, the return value is a handle to the newly created mutex object.

If the function fails, the return value is NULL. To get extended error information, call GetLastError.

Grüße
Klaus

taaktaak 6. Mai 2008 15:34

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.

Moony 6. Mai 2008 15:49

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.

taaktaak 6. Mai 2008 20:29

Re: Verhindern eine Anwendung mehrfach zu starten
 
Moin, Moin.

Schön, dass es funktioniert. Allerdings halte ich das Fragment...

Delphi-Quellcode:
CreateMutex(nil,True,'{7A366489-37B0-4E63-81A0-F0BBC281614D}');
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?

Ist vielleicht eine etwas theoretische Situation, aber der Aufwand, statt der Konstanten den veränderten EXE-Namen zu verwenden, ist doch marginal - oder?

FAlter 6. Mai 2008 20:35

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?

taaktaak 6. Mai 2008 20:40

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?

FAlter 6. Mai 2008 20:52

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 Delphi-Referenz durchsuchenhalt nicht.

Mfg
FAlter

Fussball-Robby 6. Mai 2008 20:55

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.

taaktaak 6. Mai 2008 20:55

Re: Verhindern eine Anwendung mehrfach zu starten
 
Jooo, sofort und abschließend überzeugt:
"Halt" fliegt 'raus und wird durch "Terminate" ersetzt - Danke!

taaktaak 6. Mai 2008 20:58

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.
Seite 4 von 6   « Erste     234 56      

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