Delphi-PRAXiS
Seite 1 von 5  1 23     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)

meisteralex 28. Nov 2005 07:07


Verhindern das die gleich Exe gestartet wird
 
Moint,
also mittlerweile weiß ich wie ich verhindern kann, dass zweimal das gleich Programm gestartet wird.
Habe das mit der marix-Methode realisiert (hoffe die sagt jemandem was, hab sie aber glaub ich auch aus diesem Forum).
Nun will ich aber nicht generell verhindern, dass mein Programm zweimal gestartet wird, sondern nur dass die gleiche exe zweimal gestartet wird. Sprich, wenn ich 2 identische Exe habe, wovon einen nr1.exe heißt und eine nr2.exe, dann soll ein Doppelstart möglich sein. Habe ich jedoch 2 Exes mit dem gleichen Namen nr1.exe und nr1.exe soll ein Merhfachstart verhindert werden. Dies alles soll unabhängig sein von den Pfaden in denen die exe-Dateien liegen.

Hat hierzu jemand ne Lösung ? weiß nämlich irgendwie nciht recht wie ich das machen soll?!?!

Sharky 28. Nov 2005 07:15

Re: Verhindern das die gleich Exe gestartet wird
 
Hai meisteralex,

deine "marix-Methode" kenn ich nicht. Ich mache das immer mit einem Mutex so wie hier beschrieben.

Jetzt kannst Du ja als "String für den Mutex" einfach den Namen der Exe plus einer GUID verwenden.
Delphi-Quellcode:
begin
 .
 .
 mutexstring := '{1F31C742-E52D-4EC0-8632-02BEAFA3337E}' + ExtractFileName(ParamtStr(0));
  mHandle := CreateMutex(nil,True,mutexstring);
 .
 .
end;

alzaimar 28. Nov 2005 07:41

Re: Verhindern das die gleich Exe gestartet wird
 
Wenn Du die EXE selbst geschrieben hast, dann würd ich das auch über 'Mutexe' abbilden. Wenn nicht, hilft Dir 'FindWindows' weiter. Es liefert Dir, sofern vorhanden, das Handle eines Fensters mit einer bestimmten Titelzeile und einem Klassennamen. Wenn FindWindows einen Wert<>0 liefert, läuft das Programm schon.

Du musst nur noch rausfinden, wie die Fensterklasse (und ggf. der Titel) des Hauptfensters der Anwendung heisst. Dafür verwende ich EnumWindows. Ich hab mir mal ein kleines Programm geschrieben, das die Fenstertitel und Fensterklassen auflistet. Check mal EnumWindows, das ist dann ganz einfach.

meisteralex 28. Nov 2005 08:28

Re: Verhindern das die gleich Exe gestartet wird
 
genau, meinte auch mutex
genau so habe ich es auch schon probiert, als argument habe ich den konstaten string gegen den paramstr(0), also den exe-namen ausgetauscht. Wozu ist die GUID denn noch nötig?
Wenn ich den EXE-Namen mit Hilfe von parmastr(0) als Argument der CreateMutex - Anweisung übergebe kann ich auch 2 mal die gleiche Datei ausführen, der "mehrfachstar-verhinderungs-effekt" ist also vollkommen weg.
Hat das irgendwas mit der GUID zu tun`?

Sharky 28. Nov 2005 08:33

Re: Verhindern das die gleich Exe gestartet wird
 
Zitat:

Zitat von meisteralex
... gegen den paramstr(0), also den exe-namen ausgetauscht. ...

Hai Du,

bitte beachte aber das Du mit ParamStr(0) nicht nur den Exe-Namen sondern auch den Pfad zu dieser bekommst. Wenn die selbe Exe in zwei Verzeichnissen liegt hast Du verschiedene Strings.

Zitat:

... Wozu ist die GUID denn noch nötig?
Die habe ich nur eingefügt um dein Programm eindeutig zu identifizieren. Wenn Du nur den Namen der Exe nimmst könnte ja ein anderes Programm genau das selbe machen und die beiden würden sich, obwohl sie nichts mit einander zu tun haben, gegenseitig ausschliessen.

meisteralex 28. Nov 2005 08:35

Re: Verhindern das die gleich Exe gestartet wird
 
Es war aber eine Datei aus dem gleichen Verzeichnis, welche sich auch 2 mal aufrufen ließe.
Jemand ne Ahnung warum ?
Das mit der GUID ist logisch, aber ich könnte genau so gut einen anderen eindeutigen String nehmen oder?

stonimahoni 28. Nov 2005 08:41

Re: Verhindern das die gleich Exe gestartet wird
 
Moin...

ich hab das folgendermassen realisiert :

Delphi-Quellcode:
initialization
   mHandle := CreateMutex(nil, true, 'meinprogramm');
   if (GetLastError = Error_Already_Exists) then halt;

finalization
   if mHandle <> 0 then CloseHandle(mHandle);
und halt oben noch mhandle als thandle deklariert.

Das wars bei mir soweit und geht.

MFG


Carsten

Jelly 28. Nov 2005 08:43

Re: Verhindern das die gleich Exe gestartet wird
 
Zitat:

Zitat von meisteralex
Es war aber eine Datei aus dem gleichen Verzeichnis, welche sich auch 2 mal aufrufen ließe.

Schreib doch mal bitte deinen genauen Code hin.
Du willst ja dass 2 verschieden namige Echsen auch starten dürfen.

meisteralex 28. Nov 2005 08:54

Re: Verhindern das die gleich Exe gestartet wird
 
Delphi-Quellcode:
unit mulex;

interface

implementation

uses windows,Dialogs,sysutils;

var mHandle: THandle;  

Initialization
  mHandle := CreateMutex(nil,True,paramstr(0));
  // 'xxxxx' Der Anwendungsname ist hier einzutragen
  if GetLastError = ERROR_ALREADY_EXISTS then begin  
    // Anwendung läuft bereits
    showMessage('Anwendung läuft bereits!!!!!');  
   
    Halt;
  end;

finalization
  if mHandle <> 0 then
    CloseHandle(mHandle)
end. {Dieter Hirt}
So das ist mein Code und trotzdem lässt sich eine EXE in meinem falle ist das (C:\hey.exe) 2x starten, bziehungsweise beliebig oft starten

Sharky 28. Nov 2005 08:56

Re: Verhindern das die gleich Exe gestartet wird
 
Hmm... das ist ja seltsam.

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

Delphi-Quellcode:
  mString := ParamStr(0); // So geht es nicht
  mHandle := CreateMutex(nil, True, PAnsiChar(mString));

  mString := 'blubber'; // so geht es
  mHandle := CreateMutex(nil, True, PAnsiChar(mString));


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:06 Uhr.
Seite 1 von 5  1 23     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