AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Verhindern eine Anwendung mehrfach zu starten

Verhindern eine Anwendung mehrfach zu starten

Ein Thema von Moony · begonnen am 6. Mai 2008 · letzter Beitrag vom 15. Jan 2022
Antwort Antwort
Seite 4 von 6   « Erste     234 56   
Klaus01
Online

Registriert seit: 30. Nov 2005
Ort: München
5.638 Beiträge
 
Delphi 10.4 Sydney
 
#31

Re: Verhindern eine Anwendung mehrfach zu starten

  Alt 6. Mai 2008, 16:23
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 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
Klaus
  Mit Zitat antworten Zitat
taaktaak

Registriert seit: 25. Okt 2007
Ort: Radbruch
1.984 Beiträge
 
Delphi 7 Professional
 
#32

Re: Verhindern eine Anwendung mehrfach zu starten

  Alt 6. Mai 2008, 16:34
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.
Ralph
  Mit Zitat antworten Zitat
Moony

Registriert seit: 29. Jul 2003
Ort: Essen
454 Beiträge
 
Delphi 2010 Professional
 
#33

Re: Verhindern eine Anwendung mehrfach zu starten

  Alt 6. Mai 2008, 16:49
@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.
Ich weiß, daß ich nichts weiß! Sokrates
  Mit Zitat antworten Zitat
taaktaak

Registriert seit: 25. Okt 2007
Ort: Radbruch
1.984 Beiträge
 
Delphi 7 Professional
 
#34

Re: Verhindern eine Anwendung mehrfach zu starten

  Alt 6. Mai 2008, 21:29
Moin, Moin.

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

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?
Ralph
  Mit Zitat antworten Zitat
Benutzerbild von FAlter
FAlter

Registriert seit: 21. Jul 2004
Ort: Ostfildern
1.095 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#35

Re: Verhindern eine Anwendung mehrfach zu starten

  Alt 6. Mai 2008, 21:35
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?
Felix Alter
Japanurlaub 2015
  Mit Zitat antworten Zitat
taaktaak

Registriert seit: 25. Okt 2007
Ort: Radbruch
1.984 Beiträge
 
Delphi 7 Professional
 
#36

Re: Verhindern eine Anwendung mehrfach zu starten

  Alt 6. Mai 2008, 21:40
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?
Ralph
  Mit Zitat antworten Zitat
Benutzerbild von FAlter
FAlter

Registriert seit: 21. Jul 2004
Ort: Ostfildern
1.095 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#37

Re: Verhindern eine Anwendung mehrfach zu starten

  Alt 6. Mai 2008, 21:52
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
Felix Alter
Japanurlaub 2015
  Mit Zitat antworten Zitat
Benutzerbild von Fussball-Robby
Fussball-Robby

Registriert seit: 22. Okt 2007
Ort: Nähe Köln
1.063 Beiträge
 
Delphi 7 Enterprise
 
#38

Re: Verhindern eine Anwendung mehrfach zu starten

  Alt 6. Mai 2008, 21:55
Application.Exename alleine scheint mir aber nicht "sicher", denn den Namen der Anwendung kann jeder zu jeder zeit ändern.
Robert L.
Der folgende Satz ist richtig!
Der vorherige Satz ist falsch!

Paradox
  Mit Zitat antworten Zitat
taaktaak

Registriert seit: 25. Okt 2007
Ort: Radbruch
1.984 Beiträge
 
Delphi 7 Professional
 
#39

Re: Verhindern eine Anwendung mehrfach zu starten

  Alt 6. Mai 2008, 21:55
Jooo, sofort und abschließend überzeugt:
"Halt" fliegt 'raus und wird durch "Terminate" ersetzt - Danke!
Ralph
  Mit Zitat antworten Zitat
taaktaak

Registriert seit: 25. Okt 2007
Ort: Radbruch
1.984 Beiträge
 
Delphi 7 Professional
 
#40

Re: Verhindern eine Anwendung mehrfach zu starten

  Alt 6. Mai 2008, 21:58
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...
Ralph
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 17:48 Uhr.
Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf