Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Doppelten Start eines Programmes verhindern (https://www.delphipraxis.net/79630-doppelten-start-eines-programmes-verhindern.html)

Andidreas 25. Okt 2006 16:59


Doppelten Start eines Programmes verhindern
 
hi,

ich entwickle gerade eine applikation bei der ich nicht möchte das sie an einem rechner mehrmals gestartet werden kann...

hier im forum hab ich folgende unit gefunden

Delphi-Quellcode:
unit NichtDoppeltStarten;

interface

implementation

uses windows,Dialogs,sysutils;

var mHandle: THandle;   // Mutexhandle

Initialization
  mHandle := CreateMutex(nil,True,'xxxxx');
  // 'xxxxx' Der Anwendungsname ist hier einzutragen
  if GetLastError = ERROR_ALREADY_EXISTS then begin  
    // Anwendung läuft bereits
    {showMessage('Anwendung läuft bereits!!!!!');}   
    // Wenn du deine Meldung willst, mach die Klammern weg
    Halt;
  end;

finalization  // ... und Schluß 
  if mHandle <> 0 then
    CloseHandle(mHandle)
end. {Dieter Hirt}
so etwas ähnliches möchte ich jetzt auch in meinem programm einbinden...
und zwar soll die abfrage ob das programm schon läuft so früh wie möglich erfolgen!!!

an welcher stelle muss ich da dann die abfragen einbauen??? im oncreate ereigniss meiner hauptform??? oder gehts noch früher???

Luckie 25. Okt 2006 17:01

Re: Doppelten Start eines Programmes verhindern
 
Steht doch da: ShowMessage(...), istnur auskommentiert.

bigg 25. Okt 2006 17:04

Re: Doppelten Start eines Programmes verhindern
 
hi Andidreas,

pack deinen Quellcode in deine Projekt-Datei (*.dpr), noch bevor TMainForm (dein Hauptformular) erstellt wird...

pertzschc 25. Okt 2006 18:47

Re: Doppelten Start eines Programmes verhindern
 
Zitat:

Zitat von Andidreas
an welcher stelle muss ich da dann die abfragen einbauen??? im oncreate ereigniss meiner hauptform??? oder gehts noch früher???

Du musst das Coding in eine neue Unit speichern und diese Unit in Dein Projekt einbinden. Dadurch wird ein uses-Eintrag in der .dpr-Datei automatisch erzeugt. Wenn Dein Programm initialisiert wird, werden die Units des Projektes nacheinander durchlaufen und zwar werden dabei die Initialization-Abschnitte aller Units (so vorhanden) ausgeführt. In Deinem Fall kommt die Ausführung also in der Mutex-Unit
Delphi-Quellcode:
unit NichtDoppeltStarten;
vorbei und durchläuft das Coding
Delphi-Quellcode:
Initialization
  mHandle := CreateMutex(nil,True,'xxxxx');
  // 'xxxxx' Der Anwendungsname ist hier einzutragen
  if GetLastError = ERROR_ALREADY_EXISTS then begin  
    // Anwendung läuft bereits
    {showMessage('Anwendung läuft bereits!!!!!');}   
    // Wenn du deine Meldung willst, mach die Klammern weg
    Halt;
  end;
automatisch. Das
Delphi-Quellcode:
Halt;
sorgt dafür, das der Rest nicht mehr ausgeführt wird. Damit brauchst Du das Coding nirgendwo sonst aufzurufen (OnCreate o.ä.).

Bitte noch das 'xxxxx' anpassen in einem möglichst unique-Namen Deines Programmes.

Gruß,
Christoph

Hansa 25. Okt 2006 19:08

Re: Doppelten Start eines Programmes verhindern
 
Wäre es nicht besser, beim 2. Startversuch des Programmes zu dem bereits gestarteten zurückzukehren ? Genau an die Stelle, wo man in der ersten Instanz auch war ? Ich benutze dafür z.B. eine Semaphore und darüber ist hier genügend zu lesen.

P.S.: mir gefällt die Holzhammermethode mit dem halt; nicht! Das geht auch anders.

Jürgen Thomas 25. Okt 2006 19:18

Re: Doppelten Start eines Programmes verhindern
 
Hallo,

Du könntest über Hier im Forum suchenProgramm einmal starten Hinweise bekommen.

Ich bilde mir ein, dass ich hier ein Beispiel dazu geschrieben habe, finde es aber nicht. Eine gleichartige Lösung, die sehr gut ist, findest Du hier: only_one.pas, nur 1 Instanz.

Gruß Jürgen

pertzschc 25. Okt 2006 20:07

Re: Doppelten Start eines Programmes verhindern
 
Zitat:

Zitat von Hansa
P.S.: mir gefällt die Holzhammermethode mit dem halt; nicht! Das geht auch anders.

Deinen 1. Punkt habe ich verstanden.

Was aber gefällt Dir an dem Halt; nicht?

Gruß,
Christoph

xZise 25. Okt 2006 21:04

Re: Doppelten Start eines Programmes verhindern
 
Ich kenne mich da jetzt nicht 100%ig aus, aber es sollte doch auch ohne "Halt;" laufen indem du einfach überprüfst, OB es die 1. Instanz ist?

Delphi-Quellcode:
begin
  if firstInstanz then begin
    ...
    Application.CreateForm(...);
    ...
    Application.Run;
    ...
  end;
end;
[delphi]-Tags vergessen :D

pertzschc 25. Okt 2006 21:07

Re: Doppelten Start eines Programmes verhindern
 
Zitat:

Zitat von xZise
Delphi-Quellcode:
  if firstInstanz then begin

wer oder was ist "firstInstanz"?

Gruß,
Christoph

xZise 25. Okt 2006 21:37

Re: Doppelten Start eines Programmes verhindern
 
Eine Funktion die einen Boolean zurückgibt:
Delphi-Quellcode:
function firstInstanz : Boolean;
begin
  // Überprüfen, ob dies die 1. Instanz ist, oder eine weitere...
end;
Ich habe mich nicht damit auseinandergesetzt... Deshalb kann es sein, dass es so nicht geht, aber wenn es so geht, dann kann man so ein Halt; / Application.Terminate; umgehen!

Nicht getestet:
Delphi-Quellcode:
program Project1;

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

{$R *.RES}

var
  mHandle : THandle;

begin
 
  mHandle := CreateMutex(Nil, True, 'TForm1');

  if GetLastError <> ERROR_ALREADY_EXISTS then begin
    Application.Initialize;
    Application.CreateForm(TForm1, Form1);
    Application.Run;
  end;

  if mHandle <> 0 then
   CloseHandle(mHandle);
end.


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:39 Uhr.
Seite 1 von 3  1 23      

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