Delphi-PRAXiS
Seite 2 von 5     12 34     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Verhindern das die gleich Exe gestartet wird (https://www.delphipraxis.net/57868-verhindern-das-die-gleich-exe-gestartet-wird.html)

toms 28. Nov 2005 08:58

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.

Sharky 28. Nov 2005 09:03

Re: Verhindern das die gleich Exe gestartet wird
 
Zitat:

Zitat von toms
Ich wuerde nicht paramstr(0) als mutex-object Name nehmen, ansonsten laesst sich die EXE aus einem anderen Verzeichnis auch starten.

Hai toms,

am anfang steht:
Zitat:

... Dies alles soll unabhängig sein von den Pfaden in denen die exe-Dateien liegen
Jetzt ist da nicht klar ob das Programm laufen soll wenn es in zwei verschiedenen Verzeichnissen liegt oder nicht.

Darum habe ich in meinem ersten Posting ja auch geschrieben das mit Delphi-Referenz durchsuchenExtractFileName gearbeitet werden soll ;-)

Nachtrag
So geht es übgrigens:
Delphi-Quellcode:
  mString := '{8F9B886B-444C-47B3-934E-8A2780F01B62}' + ExtractFileName(ParamStr(0));
  mHandle := CreateMutex(nil, True, PAnsiChar(mString));
Aber warum geht es nicht wenn ich "nur" mit ParamStr(0) arbeite?

meisteralex 28. Nov 2005 09:05

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:

Wenn man den Code aus der Code-Library nimmt und als "String" ParamStr(0) verwendet funktioniert es nicht.
warum nicht ?

und wie mache ich es dann, wenn nicht so?:
Delphi-Quellcode:
mString := ParamStr(0); // So geht es nicht
  mHandle := CreateMutex(nil, True, PAnsiChar(mString));

Jelly 28. Nov 2005 10:14

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.

meisteralex 28. Nov 2005 10:26

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 ?

Angel4585 28. Nov 2005 10:43

Re: Verhindern das die gleich Exe gestartet wird
 
AusZug aus dem EasyDelphiHelper:
Zitat:

Mehrfachstart verhindern
CreateMutex, Mutex, HPrevInst


--------------------------------------------------------------------------------

Über eine Mutex lässt sich verhindern, dass ein Programm mehrmals gestartet werden kann.

Die Mutex sollte zum frühstmöglichen Zeitpunkt erstellt werden. Man kann die Zeilen beispielsweise in einer eigenen Unit ablegen und diese an erster Stelle der Uses-Klausel schreiben.

Der dritte Parameter von CreateMutex vergibt einen Namen mit dem die Mutex im System identifiziert werden kann (z.B. den Programmnamen).

Der Projekt-Quelltext könnte dann in etwa so aussehen:
Delphi-Quellcode:
program Project1;

uses
 mutex in 'mutex.pas', //Hier wird das Mutex-Objekt erstellt.
 Forms,
 Unit1 in 'Unit1.pas' {Form1};

{$R *.RES}

begin
 Application.Initialize;
 Application.CreateForm(TForm1, Form1);
 Application.Run;
end.
Die Unit für das Mutex-Objekt sieht folgendermaßen aus:
Delphi-Quellcode:
unit mutex;

interface

implementation

Uses Windows;

var
 mHandle: THandle;

initialization
 //Der Name für die Mutex muss natürlich angepasst werden
 mHandle := CreateMutex(Nil, True, PChar('Programmname'));

 if GetLastError = ERROR_ALREADY_EXISTS then
   //Die Bedingung trifft zu, wenn die Mutex schon existiert.
   //Dies ist der Fall, wenn das Programm bereits gestartet
   //wurde.
   Halt;

finalization
 if mHandle <> 0 then
   CloseHandle(mHandle);
end.
Für Delphi 1 (16 Bit) gibt es eine wesentlich einfachere Variante. Die Anwendung bekommt das Handle der letzten aktiven Instanz mitgeteilt. Man muss also nur nachsehen, ob die entsprechende Variable (HPrevInst) 0 enthält. Die Variable ist zwar auch in späteren Versionen noch verfügbar, erfüllt aber seit Delphi 2 keinen Zweck mehr.
EDIT: Als Programmname würd ich ExtractFileName(ParamStr(0)) empfehlen

Sharky 28. Nov 2005 10:46

Re: Verhindern das die gleich Exe gestartet wird
 
Zitat:

Zitat von Angel4585
AusZug aus dem EasyDelphiHelper:

Hai Angel4585,

hast Du dir mal den gesamten Thread durchgelesen? Das mit dem Mutex haben wir ja schon im ersten Posting geklärt.

Angel4585 28. Nov 2005 10:47

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.

meisteralex 28. Nov 2005 11:04

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

Jelly 28. Nov 2005 11:07

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 03:37 Uhr.
Seite 2 von 5     12 34     Letzte »    

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