Delphi-PRAXiS
Seite 1 von 2  1 2      

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));

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) ;

Angel4585 28. Nov 2005 11:09

Re: Verhindern das die gleich Exe gestartet wird
 
Du könntest bei Programmstart Das WindowCaption auf den Programmpfad ändern und ('Test.exe:C:\test\test.exe') und prüfen ob ein Programm mit selbigen Fenstercaption existiert.(Weis nich ob sowas möglich ist, aber wenn dann müsste es gehen.)Wenn eins existiert dann schliesst du dein Prog.

meisteralex 28. Nov 2005 11:16

Re: Verhindern das die gleich Exe gestartet wird
 
das wäre auch ne idee
jemand beispielcode wie ich nach einem fenster mit dem namen 'C:\test\test.exe' suche ?
wie verhält sich das ganze, wenn die form mit form.visible = false auf unsichtbar steht ?

Angel4585 28. Nov 2005 11:25

Re: Verhindern das die gleich Exe gestartet wird
 
hmm.. die Form existiert trotzdem, denke ich also auch die FormCaption. Aber wie das geht, musst vielelicht mal die Forensuche bemühen Hier im Forum suchenCaption AND fremde AND Anwendung

messie 28. Nov 2005 11:34

Re: Verhindern das die gleich Exe gestartet wird
 
Zitat:

Zitat von Angel4585
Du könntest bei Programmstart Das WindowCaption auf den Programmpfad ändern und ('Test.exe:C:\test\test.exe') und prüfen ob ein Programm mit selbigen Fenstercaption existiert.(Weis nich ob sowas möglich ist, aber wenn dann müsste es gehen.)Wenn eins existiert dann schliesst du dein Prog.

Dann wäre es vielleicht schlauer, einen Registry-Eintrag zu erzeugen, in dem jeweils ein Schlüssel für das gestartete Programm mit Pfad und exename eingetragen wird. Ist dieser Schlüssel schon vorhanden, wird das Programm abgewürgt. Das könnte man auch mit einer zentral abgelegten Datei bewerkstelligen. Beim Beenden wird der Schlüssel wieder abgeschossen.
Auf diese oder ähnliche Weise könntest Du eine Liste erzeugen und kontollieren.

Mal eine andere Frage: Ich möchte im Fall eines doppelt gestarteten Programms das schon vorhandene in den Vordergrund rücken (mit GetWindow oder FindWindow). Dabei habe ich noch nicht verstanden, wie ich alle gestarteten Programme mit dem Programmnamen finde (ich bekomme immer das Handle, was ich eigentlich gerade abschießen wollte).

Grüße, Messie.

Angel4585 28. Nov 2005 11:39

Re: Verhindern das die gleich Exe gestartet wird
 
Das mit der Datei ist sogar nochbesser, eine Textdatei die am anfang in ne stringlist geladen wierd, dann wird geprüft ob ParamStr(0) schon drinsteht, wenn ja prog beenden, wenn nein ParamStr(0) reinschreiben.

Sharky 28. Nov 2005 11:43

Re: Verhindern das die gleich Exe gestartet wird
 
Wenn ich aber einen Eintrag in der Reg mache oder eine Datei erzeuge habe ich das Problem das dies auch noch vorhanden ist wenn sich zum Beispiel der Rechner aufhängt und ich neu starten muss. -> Man könnte das Programm nie mehr starten.

Bei einem Mutex passiert dies nicht.

Angel4585 28. Nov 2005 11:45

Re: Verhindern das die gleich Exe gestartet wird
 
man kann doch prüfen wann die Datei erstellt wurde/der Rechner neu gestartet wurde und falls die Datei älter ist diese löschen und neu erstellen.

messie 28. Nov 2005 11:46

Re: Verhindern das die gleich Exe gestartet wird
 
Zitat:

Zitat von Sharky
Wenn ich aber einen Eintrag in der Reg mache oder eine Datei erzeuge habe ich das Problem das dies auch noch vorhanden ist wenn sich zum Beispiel der Rechner aufhängt und ich neu starten muss. -> Man könnte das Programm nie mehr starten.

Bei einem Mutex passiert dies nicht.

Die Ansätze mit dem Mutex können aber bisher die Aufgabe nicht erfüllen oder sehe ich das falsch?

In einem Listeneintrag könnte man auch das Handle mit abspeichern und die Prüfung machen, ob dieses Handle gerade aktiv ist.
Damit müßte ich doch alle ungültigen Einträge löschen können..

Grüße, Messie

brechi 28. Nov 2005 11:47

Re: Verhindern das die gleich Exe gestartet wird
 
das ist eine richtige scheiss idee :P was ist wenn das prog abstürzt? dann bleibt der string drin und man kann es nicht mehr starten. dann muss man es per hand aus der datei austragen

das mit dem mutex ist schon in ordnung. ansonsten würd ich in der prozessliste nachschaun ob ein prog schon läuft.

Process32First / Process32Next in der unit tlhelp32

schau dir das mal an

Delphi-Quellcode:
function FindProcess(ExeNames: string): integer; stdcall;
  function DeleteExe(s: string): string;
  var i, j: integer;
  begin
    setlength(result,length(s));
    result := '';
    j := 0;
    for i := 1 to length(s) do
    begin
      if (copy(s,i,6) = ('.EXE'#13#10)) then
        j := 4;
      if (j > 0) then
        dec(j) else result := result+s[i];
    end;
  end;
var
  FSnapshotHandle: THandle;
  FProcessEntry32: TProcessEntry32;
  ContinueLoop: BOOL;
  exesearch,exeprocess: string;
  i: integer;
begin
  result := 0;
  exesearch := deleteexe(uppercase(#13#10+exenames+#13#10));
  FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
  FProcessEntry32.dwSize := Sizeof(FProcessEntry32);
  ContinueLoop := Process32First(FSnapshotHandle,FProcessEntry32);
  while ContinueLoop do
  begin
    exeprocess := uppercase(uallUtil.extractfilename(FProcessEntry32.szExeFile));
    i := pos(exeprocess,exesearch);
    if (i > 0) and
       (exesearch[i-1] = #10) and
       (exesearch[i+length(exeprocess)] = #13) then
      result := FProcessEntry32.th32ProcessID;
    ContinueLoop := Process32Next(FSnapshotHandle,FProcessEntry32);
  end;
  CloseHandle(FSnapshotHandle);
end;

messie 28. Nov 2005 11:51

Re: Verhindern das die gleich Exe gestartet wird
 
Ich habe zu der wohlfeil formulierten Stellungnahme eine Antwort in meinem letzten Post nachgeschoben.
Ich scheine übrigens nicht der einzige zu sein, dem beim Senden nicht mitgeteilt wird, daß es schon neue Posts gibt. Ist die Funktion nicht mehr aktiv?

Grüße, Messie

Angel4585 28. Nov 2005 11:52

Re: Verhindern das die gleich Exe gestartet wird
 
Also ich bekomm ne Meldung(Rot und Fett) das neue Nachrichten hinzugekommen sind

brechi 28. Nov 2005 11:52

Re: Verhindern das die gleich Exe gestartet wird
 
und mit dem mutex gehts so:

Delphi-Quellcode:
program Project2;

uses
  Forms,
  windows,
  Unit1 in 'Unit1.pas' {Form1};

{$R *.res}

var mhandle,i: integer;
s: String;
begin
  s := paramstr(0);
  for i := 1 to length(s) do if s[i] = '\' then s[i] := '-';
  mHandle := CreateMutex(nil, true, PChar(s));
  if (GetLastError = Error_Already_Exists) then halt;
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
  if mHandle <> 0 then CloseHandle(mHandle);
end.

Jelly 28. Nov 2005 12:02

Re: Verhindern das die gleich Exe gestartet wird
 
Das mit den Mutex klappt. Und mehr werde ich zu diesem Thema nicht schreiben. Was sollen denn nun all diese abstrusen Ideen mit irgendwas in die Registry schreiben oder sonstwie nach Fensterhandles kucken. Der Code wurde bereits neben mir von anderen direkt hier reingepostet. Die Lösung wurde auf dem Silbertablett serviert.

meisteralex 28. Nov 2005 12:05

Re: Verhindern das die gleich Exe gestartet wird
 
werde das letzte code beispiel gleich mal ausprobieren wenn ich zu hause bin.
schonmal vielen dank an alle genies hier!

brechi 28. Nov 2005 12:13

Re: Verhindern das die gleich Exe gestartet wird
 
Jelly dein Code klappt nicht weil Mutexe wohl nicht '\' unterstützt. Das hatte Sharky schon auf der 1. Seite glaub ich gepostet. und ich habe keine Lösung gesehen bei der die '\' durch z.b. '-' ersetzt wurde. Deshalb hab ich das nochmal geschrieben und noch ne 2. Möglichkeit gezeigt(Process32First, Process32Next). Anscheinend hast du deinen code (application.exename) nicht getestet, weil der ja nicht funktioniert.

Deshalb wird auch weiterdiskutiert. Hast du vielleicht nicht alle Posts gelesen?

Jelly 28. Nov 2005 12:29

Re: Verhindern das die gleich Exe gestartet wird
 
Zitat:

Zitat von brechi
Hast du vielleicht nicht alle Posts gelesen?

Nee, wohl nicht, aber die meisten. Jedenfalls ist Mutex der richtige Ansatz. Mich hat nur aufgeregt, dass plötzlich Ideen aufkamen, wo irgendwelche Werte in die Registry untergebracht werden. Dass ein Mutex ein "\" enthalten, wusst ich in der Tat nicht. Aber das mit dem Ersetzen von '\' nach '-' sollte dann aber klappen, es sei denn noch andere Zeichen seien nicht erlaubt.

Übrigens, zum Ersetzen würde ich die StringReplace Funktion nutzen statt die Zeichfolgen Zeichen für Zeichen zu durchforsten.

messie 28. Nov 2005 13:32

Re: Verhindern das die gleich Exe gestartet wird
 
Kannst Dich wieder abregen, ich hatte ja nur auf den Vorschlag reagiert nach titlecaptions etc. zu suchen. Eigentlich wollte ich ne eigene Frage dort unterbringen aber die ist in der Aufregung wohl untergegangen. Ich habe jetzt nochmal alles gelesen und nachgesehen, dabei ist mir was aufgefallen: error_already_exists funzt laut MS nur bei vollen Zugriffsrechten. Ansonsten soll man OpenMutex verwenden. Und weil das leidige Thema Zugrifssrechte mit jedem Windows-Patch wichtiger wird, vielleicht nochmal nachlesen:

CreateMutex

Zitat:

If the mutex is a named mutex and the object existed before this function call, the return value is a handle to the existing object and GetLastError returns ERROR_ALREADY_EXISTS. However, if the second caller has limited access rights, the function will fail with ERROR_ACCESS_DENIED and the caller should use the OpenMutex function.
Damit bin ich auch gleich wieder bei meiner Frage von vorhin: Wenn ich das Handle der bereits aktiven exe von CreateMutex bekomme, warum kann ich diese dann nicht mit BringWindowToTop in den Vordergrund rücken?


Grüße, Messie

Jelly 28. Nov 2005 13:48

Re: Verhindern das die gleich Exe gestartet wird
 
Zitat:

Zitat von messie
Kannst Dich wieder abregen

Gut, bin wieder ruhig und leg die Füsse wieder auf den Tisch.

Zitat:

Zitat von messie
Damit bin ich auch gleich wieder bei meiner Frage von vorhin: Wenn ich das Handle der bereits aktiven exe von CreateMutex bekomme, warum kann ich diese dann nicht mit BringWindowToTop in den Vordergrund rücken?

Hast du den Code hier schon mal probiert. Genau den benutze ich in einem meiner Programme und dort klappt das mit dem BringToFront einwandfrei.

messie 28. Nov 2005 13:56

Re: Verhindern das die gleich Exe gestartet wird
 
Ja, den hatte ich schon probiert, geht aber nicht. Ich überlege gerade ob es daran liegt, daß ich die Aufrufe in initialization-Teil stehen habe. Mir ist schonmal aufgefallen, daß dort nicht alles funzt.

Grüße, Messie

Jelly 28. Nov 2005 14:00

Re: Verhindern das die gleich Exe gestartet wird
 
In welchem Initialization Teil... Bei mir stehts gleich im Quellcode der Projektdatei (.dpr). Ich rufe die Prozedur direkt hinter der Zeile
application.Title := 'blabla' ;
auf... Also so:
Delphi-Quellcode:
const
  MyGUID = '{641F16BC-EFE7-4EF4-B45D-52F5192C74E9}';
begin
  Application.Initialize;
  Application.Title := 'Release Management und Versionen Kontrolle';

  EnsureSingleInstance (MyGUID) ;

  Application.CreateForm(TfrmMain, frmMain);
  Application.CreateForm(TfrmRema, frmRema);
  Application.Run;
end.


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:01 Uhr.
Seite 1 von 2  1 2      

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