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
Thema durchsuchen
Ansicht
Themen-Optionen

Verhindern eine Anwendung mehrfach zu starten

Ein Thema von Moony · begonnen am 6. Mai 2008 · letzter Beitrag vom 15. Jan 2022
Antwort Antwort
Seite 6 von 6   « Erste     456   
HolgerX

Registriert seit: 10. Apr 2006
Ort: Leverkusen
969 Beiträge
 
Delphi 6 Professional
 
#51

AW: Verhindern eine Anwendung mehrfach zu starten

  Alt 13. Jan 2022, 15:40
Hmm..

Das ist die einfachste Lösung, wenn man sicherstellen will, dass ein Programm nur einmal gestartet wird.

Was diese Lösung aber nicht kann:

Die übergebenen Parameter an die erste Instanz weiterreichen, damit diese damit weiterarbeiten kann.

Und genau da liegt ja aktuell das Problem.
Wieso sendest Du dann nicht eine Message an deine andere Instanz?

Z.B. in der DPR (wie oben als Beispiel)

Delphi-Quellcode:
const
  c_ProgStartMutexName = 'MeinProgrammName';



  {Attempt to create a named mutex}
  CreateMutex(nil, false, c_ProgStartMutexName);
  {if it failed then there is another instance}
  if GetLastError = ERROR_ALREADY_EXISTS then
    begin
    {Send all windows our custom message - only our other}
    {instance will recognise it}
    SendMessage(HWND_BROADCAST,
                RegisterWindowMessage(c_ProgStartMutexName),
                0,
                0);
    {Lets quit}
    Halt(0);
  end;
  Application.Initialize;

Dort, im Hauptfenster vorher:

Delphi-Quellcode:
const
  c_ProgStartMutexName = 'MeinProgrammName';

var
 OldWindowProc : Pointer; {Variable for the old windows proc}
 MyMsg : Int64; {custom systemwide message}

function NewWindowProc(WindowHandle : hWnd;TheMessage : LongInt;
  ParamW : LongInt; ParamL : LongInt) : LongInt stdcall;
begin
  if TheMessage = MyMsg then begin
    {Tell the application to restore, let it restore the form}
    SendMessage(Application.handle, WM_SYSCOMMAND, SC_RESTORE, 0);
    SetForegroundWindow(Application.Handle);
    {We handled the message - we are done}
    Result := 0;
    exit;
  end;
  {Call the original winproc}
  Result := CallWindowProc(OldWindowProc, WindowHandle, TheMessage, ParamW, ParamL);
end;

procedure TFormMeineMainForm.FormCreate(Sender: TObject);
begin
  //Register a custom windows message
  MyMsg := RegisterWindowMessage(c_ProgStartMutexName);
  //Set form1's windows proc to ours and remember the old window proc
  OldWindowProc := Pointer(SetWindowLong(FormHauptmenue.Handle, GWL_WNDPROC, LongInt(@NewWindowProc)));
  ..
end;

In diesem Beispiel wird der ersten Instanz einfach nur mitgeteilt, dass sie sich wieder nach vorne bringen soll..
Kannst aber auch eine andere Message oder IPC verwenden, um z.B. deinen Sting zu übergeben.
(Ja ich Verwende Delphi 6 Pro und will NICHT wechseln!)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.034 Beiträge
 
Delphi 12 Athens
 
#52

AW: Verhindern eine Anwendung mehrfach zu starten

  Alt 13. Jan 2022, 18:44
Und wo übergibst du dort die "Parameter" ?

Die beiden verlinkten Units nutzen dafür WM_COPYDATA, um quasi GetCommandLine zu übergeben, wobei dort der Speicher für den "String" (damals ANSI und jetzt Unicode) falsch vewaltet wird/wurde, weswegen es nun nicht mehr im "neuen" Delphi funktioniert(e).



Man könnte es noch mit WM_SETTEXT/SendTextMessage versuchen, wo Windows notfalls die ANSI/Unicodeumwandlung vornehmen würde, falls nötig,
wenn man zu doof ungeschickt ist WM_COPYDATA richtig zu verwenden.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (13. Jan 2022 um 18:47 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Sinspin
Sinspin

Registriert seit: 15. Sep 2008
Ort: Dubai
674 Beiträge
 
Delphi 10.3 Rio
 
#53

AW: Verhindern eine Anwendung mehrfach zu starten

  Alt 14. Jan 2022, 08:06
Das ist die einfachste Lösung, wenn man sicherstellen will, dass ein Programm nur einmal gestartet wird.

Was diese Lösung aber nicht kann:

Die übergebenen Parameter an die erste Instanz weiterreichen, damit diese damit weiterarbeiten kann.

Und genau da liegt ja aktuell das Problem.
Kalt erwischt
Danke.

Ich arbeite mit Named Pipes zur Kommunikation meiner Programteile untereinander. Das zuerst gestartete macht den Server auf, nach dem dann alle anderen Teile suchen.
Das gleiche geht doch hier auch.

Wobei natürlich PostMessage viel eleganter ist solange man an das passende Handle kommt.

Die Datenübertragung erledigt eine serealisierte Memtable deren Daten als Bytestrom oder B64 String übertragen werden.
Stefan
Nur die Besten sterben jung
A constant is a constant until it change.

Geändert von Sinspin (14. Jan 2022 um 09:42 Uhr) Grund: Tippfehler
  Mit Zitat antworten Zitat
HolgerX

Registriert seit: 10. Apr 2006
Ort: Leverkusen
969 Beiträge
 
Delphi 6 Professional
 
#54

AW: Verhindern eine Anwendung mehrfach zu starten

  Alt 14. Jan 2022, 08:08
Hmm..

Und wo übergibst du dort die "Parameter" ?
Ich hatte doch geschrieben


In diesem Beispiel wird der ersten Instanz einfach nur mitgeteilt, dass sie sich wieder nach vorne bringen soll..
Kannst aber auch eine andere Message oder IPC verwenden, um z.B. deinen Sting zu übergeben.
Da hier zwei getrennte Prozesse involviert sind, muss natürlich eine Übermittlung über einen entsprechenden Weg gemacht werden..
Ich würde auch nicht einfach die Parameter als Text hinschicken, sondern ggf. eine Recordstrucktur, welche dem Empfänger auch mitteilt, dass es sich um 'Parameter des Programmaufrufes' handelt.
(Ja ich Verwende Delphi 6 Pro und will NICHT wechseln!)
  Mit Zitat antworten Zitat
HolgerX

Registriert seit: 10. Apr 2006
Ort: Leverkusen
969 Beiträge
 
Delphi 6 Professional
 
#55

AW: Verhindern eine Anwendung mehrfach zu starten

  Alt 14. Jan 2022, 08:14
Hmm..

Ich arbeite mit Named Pipes zur Kommunikation meienr Programteile untereinander. Das zuerst gestartete macht den Server auf, nach dem dann alle anderen Teile suchen.
Das gleiche geht doch hier auch.
Wenn schon eine Pipe da ist, wieso dann nicht statt Mutex auf das Vorhandensein der Pipe prüfen, schießlich kann eine NamedPipe nur einmal erstellt werden (soweit ich weiß), wie bei einem Socketserver.

Dann kannst Du die Informationen direkt dorthin schicken, ist sogar besser, da nicht alle Messages mit UserData Prozess übergreifend verschickt werden.

Ach ja:
Kein Postmessage, sondern Sendmessage verwenden! Denn z.B. WM_COPYDATA funktioniert nur richtig damit..
(Ja ich Verwende Delphi 6 Pro und will NICHT wechseln!)
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#56

AW: Verhindern eine Anwendung mehrfach zu starten

  Alt 14. Jan 2022, 10:33
Jupp, genau das meinte ich. Ich hatte es lediglich um ein paar für mich speziellere Dinge erweitert wo ich mir gerade den Quelltext anschaue und vergleiche
(ich wollte noch eine option haben die steuert ob programm a.exe parameter an b.exe übergibt, ob b.exe vor dem ".run" von a.exe terminiert werden soll usw... paar spielereien halt)
Wie dem auch sei, das rad muss nicht neu erfunden werden, soll nicht bedeuten das die Quelltexte der anderen falsch sind, um gottes willen nein, nur mach ich mir darüber keine gedanken mehr.
Lieber würde ich die PBOnceOnly.pas CrossPlatform fähig machen
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Carsten Hölscher

Registriert seit: 29. Jul 2008
77 Beiträge
 
Delphi 11 Alexandria
 
#57

AW: Verhindern eine Anwendung mehrfach zu starten

  Alt 15. Jan 2022, 18:16
Es lebe Unicode ... der Code war noch aus Zeiten von vor 2009

Hab's nicht getestet, aber ich denke mal so müsste es aussehn:

....
Ja, geht. Vielen Dank. Da war ich immerhin irgendwie schon ganz nah dran bei meinen eigenen Versuchen

In dem Komponenten-Thema kann ich ja nicht schreiben, vielleicht kann es da jemand entsprechend aktualisieren?

Carsten
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 6 von 6   « Erste     456   


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 10:45 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