![]() |
Re: Verhindern das die gleich Exe gestartet wird
Ich wuerde nicht paramstr(0) als mutex-object Name nehmen, ansonsten laesst sich die EXE aus einem anderen Verzeichnis auch starten.
|
Re: Verhindern das die gleich Exe gestartet wird
Zitat:
am anfang steht: Zitat:
Darum habe ich in meinem ersten Posting ja auch geschrieben das mit ![]() Nachtrag So geht es übgrigens:
Delphi-Quellcode:
Aber warum geht es nicht wenn ich "nur" mit ParamStr(0) arbeite?
mString := '{8F9B886B-444C-47B3-934E-8A2780F01B62}' + ExtractFileName(ParamStr(0));
mHandle := CreateMutex(nil, True, PAnsiChar(mString)); |
Re: Verhindern das die gleich Exe gestartet wird
@toms: genau das ist mein wille, also es sollen z.b. C:\hey.exe und C:\test\hey.exe gleichzeitig laufen können
@sharky: Zitat:
und wie mache ich es dann, wenn nicht so?:
Delphi-Quellcode:
mString := ParamStr(0); // So geht es nicht
mHandle := CreateMutex(nil, True, PAnsiChar(mString)); |
Re: Verhindern das die gleich Exe gestartet wird
Probier mal diesen Code, den Du hinter Application.Title := ... deines Projets ausführst. Klappt bei mir einwandfrei. Und wenn die Anwendung bereits läuft, wird ein Zweitstart nicht nur unterbunden sondern die bereits laufende Anwendung wird automatisch nach vorne gebracht:
Delphi-Quellcode:
unit OneInst;
interface { Make a call to this procedure in your project source immediately before the first call to CreateForm. That should ensure it is after the Application.Title assignment that can muck up the logic. If you haven't set an application title yet, then do so to ensure this works } procedure EnsureSingleInstance (MyGUID : string) ; implementation uses WinTypes, WinProcs, Forms, SysUtils, Messages; procedure EnsureSingleInstance (MyGUID : string) ; var Wnd: HWnd; WndClass, WndText: array[0..255] of char; begin {$ifdef Win32} { Try and create a semaphore. If we succeed, then check } { if the semaphore was already present. If it was } { then a previous instance is floating around. } { Note the OS will free the returned semaphore handle } { when the app shuts so we can forget about it } if (CreateSemaphore(nil, 0, 1, PChar(MyGUID)) <> 0) and (GetLastError = Error_Already_Exists) then {$else} if HPrevInst <> 0 then {$endif} begin Wnd := GetWindow(Application.Handle, gw_HWndFirst); while Wnd <> 0 do begin { Look for the other TApplication window out there } if Wnd <> Application.Handle then begin { Check it's definitely got the same class and caption } GetClassName(Wnd, WndClass, Pred(SizeOf(WndClass))); GetWindowText(Wnd, WndText, Succ(Length(Application.Title))); if (StrPas(WndClass) = Application.ClassName) and (StrPas(WndText) = Application.Title) then begin { This technique is used by the VCL: post } { a message then bring the window to the } { top, before the message gets processed } PostMessage(Wnd, wm_SysCommand, sc_Restore, 0); {$ifdef Win32} SetForegroundWindow(Wnd); {$else} BringWindowToTop(Wnd); {$endif} Halt end end; Wnd := GetWindow(Wnd, gw_HWndNext) end end end; end. |
Re: Verhindern das die gleich Exe gestartet wird
@jelly
wie verhält sich dein code wenn ich ne copy der exe starten will? also z.b. c:\test.exe und c:\test\test.exe ? |
Re: Verhindern das die gleich Exe gestartet wird
AusZug aus dem EasyDelphiHelper:
Zitat:
|
Re: Verhindern das die gleich Exe gestartet wird
Zitat:
hast Du dir mal den gesamten Thread durchgelesen? Das mit dem Mutex haben wir ja schon im ersten Posting geklärt. |
Re: Verhindern das die gleich Exe gestartet wird
Oh Sorry, es schien mir einfach nochnicht gelöst geworden zu sein, deswegen hab ich das gepostet :oops: , bei mir funzt das tadellos.
|
Re: Verhindern das die gleich Exe gestartet wird
ja bei mir ja auch, das eigentlich problem ist, dass sich nur die exakt gleiche exe nicht 2 mal starten lassen soll.
mit exakt gleich meine ich, das es die selbe ist, und nicht die gleiche! nochmal: C:\test.exe soll nicht 2 mal aufgerufen werden können C:\test.exe und C:\test\test.exe sollen jedoch gleichzeitig aufgerufen werden können, wobei hier C:\test.exe und C:\test\test.exe identische Dateien sind |
Re: Verhindern das die gleich Exe gestartet wird
Sorge dafür dass du eine entsprechende GUID verwendest. Wenn du die Echsen aus 2 unterschiedlichen Verz. starten lassen willst, muss auf jeden Fall der Verzeichnispfad mit rein.
Also z.B.
Delphi-Quellcode:
EnsureSingleInstance ('{8F9B886B-444C-47B3-934E-8A2780F01B62}' + application.Exename) ;
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:09 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