![]() |
AW: Verhindern eine Anwendung mehrfach zu starten
Hmm..
Zitat:
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. |
AW: Verhindern eine Anwendung mehrfach zu starten
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. |
AW: Verhindern eine Anwendung mehrfach zu starten
Zitat:
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. |
AW: Verhindern eine Anwendung mehrfach zu starten
Hmm..
Zitat:
Zitat:
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. ;) |
AW: Verhindern eine Anwendung mehrfach zu starten
Hmm..
Zitat:
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.. |
AW: Verhindern eine Anwendung mehrfach zu starten
Zitat:
(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 :-) |
AW: Verhindern eine Anwendung mehrfach zu starten
Zitat:
In dem Komponenten-Thema kann ich ja nicht schreiben, vielleicht kann es da jemand entsprechend aktualisieren? Carsten |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:50 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