AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Verhindern das die gleich Exe gestartet wird
Thema durchsuchen
Ansicht
Themen-Optionen

Verhindern das die gleich Exe gestartet wird

Ein Thema von meisteralex · begonnen am 28. Nov 2005 · letzter Beitrag vom 29. Nov 2005
Antwort Antwort
Seite 2 von 5     12 34     Letzte »    
Benutzerbild von toms
toms
(CodeLib-Manager)

Registriert seit: 10. Jun 2002
4.648 Beiträge
 
Delphi XE Professional
 
#11

Re: Verhindern das die gleich Exe gestartet wird

  Alt 28. Nov 2005, 09:58
Ich wuerde nicht paramstr(0) als mutex-object Name nehmen, ansonsten laesst sich die EXE aus einem anderen Verzeichnis auch starten.
Thomas
  Mit Zitat antworten Zitat
Benutzerbild von Sharky
Sharky

Registriert seit: 29. Mai 2002
Ort: Frankfurt
8.252 Beiträge
 
Delphi 2006 Professional
 
#12

Re: Verhindern das die gleich Exe gestartet wird

  Alt 28. Nov 2005, 10:03
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?
Stephan B.
"Lasst den Gänsen ihre Füßchen"
  Mit Zitat antworten Zitat
meisteralex

Registriert seit: 22. Nov 2005
173 Beiträge
 
#13

Re: Verhindern das die gleich Exe gestartet wird

  Alt 28. Nov 2005, 10:05
@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));
  Mit Zitat antworten Zitat
Benutzerbild von Jelly
Jelly

Registriert seit: 11. Apr 2003
Ort: Moestroff (Luxemburg)
3.741 Beiträge
 
Delphi 2007 Professional
 
#14

Re: Verhindern das die gleich Exe gestartet wird

  Alt 28. Nov 2005, 11:14
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.
  Mit Zitat antworten Zitat
meisteralex

Registriert seit: 22. Nov 2005
173 Beiträge
 
#15

Re: Verhindern das die gleich Exe gestartet wird

  Alt 28. Nov 2005, 11:26
@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 ?
  Mit Zitat antworten Zitat
Angel4585

Registriert seit: 4. Okt 2005
Ort: i.d.N.v. Freiburg im Breisgau
2.199 Beiträge
 
Delphi 2010 Professional
 
#16

Re: Verhindern das die gleich Exe gestartet wird

  Alt 28. Nov 2005, 11:43
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
Martin Weber
Ich bin ein Rüsselmops
  Mit Zitat antworten Zitat
Benutzerbild von Sharky
Sharky

Registriert seit: 29. Mai 2002
Ort: Frankfurt
8.252 Beiträge
 
Delphi 2006 Professional
 
#17

Re: Verhindern das die gleich Exe gestartet wird

  Alt 28. Nov 2005, 11:46
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.
Stephan B.
"Lasst den Gänsen ihre Füßchen"
  Mit Zitat antworten Zitat
Angel4585

Registriert seit: 4. Okt 2005
Ort: i.d.N.v. Freiburg im Breisgau
2.199 Beiträge
 
Delphi 2010 Professional
 
#18

Re: Verhindern das die gleich Exe gestartet wird

  Alt 28. Nov 2005, 11:47
Oh Sorry, es schien mir einfach nochnicht gelöst geworden zu sein, deswegen hab ich das gepostet , bei mir funzt das tadellos.
Martin Weber
Ich bin ein Rüsselmops
  Mit Zitat antworten Zitat
meisteralex

Registriert seit: 22. Nov 2005
173 Beiträge
 
#19

Re: Verhindern das die gleich Exe gestartet wird

  Alt 28. Nov 2005, 12:04
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
  Mit Zitat antworten Zitat
Benutzerbild von Jelly
Jelly

Registriert seit: 11. Apr 2003
Ort: Moestroff (Luxemburg)
3.741 Beiträge
 
Delphi 2007 Professional
 
#20

Re: Verhindern das die gleich Exe gestartet wird

  Alt 28. Nov 2005, 12:07
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.
EnsureSingleInstance ('{8F9B886B-444C-47B3-934E-8A2780F01B62}' + application.Exename) ;
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 5     12 34     Letzte »    


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 03:23 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