Seite 1 von 3
Programm - nur eine Instanz erlauben
Verfasst: 11.11.2009 11:06
von Mr.Vain
Hallo,
ich möchte ein kleines Programm erstellen, mit dem ich einfach nur ein anderes Programm starte - dabei darf aber immer nur eine Instanz laufen - wie mache ich das am besten?
Gruß
Mr.Vain
Re: Programm - nur eine Instanz erlauben
Verfasst: 11.11.2009 12:02
von PureLust
Hi Mr.Vain, ...
schau mal
in diesen Thread rein ... der Beitrag von mk-soft sollte eigentlich genau das machen was Du suchst.
Relevant für Dich ist dabei eigentlich nur die Prozedur: AppInstanceExists() (sowie evtl. benötigte Deklarationen).
[Edit:] Hier mal der auf's Wesentliche zusammen gekürzte Code aus mk-softs Beispiel:
Code: Alles auswählen
Global g_hMutexAppRunning
Procedure AppInstanceExists()
Protected bAppRunning = FALSE;
g_hMutexAppRunning = CreateMutex_( #Null, #Null, "Global\MyApplication1");
If (g_hMutexAppRunning <> #Null) And (GetLastError_() = #ERROR_ALREADY_EXISTS)
CloseHandle_( g_hMutexAppRunning );
g_hMutexAppRunning = #Null;
EndIf
If g_hMutexAppRunning
ProcedureReturn #False;
Else
ProcedureReturn #True
EndIf
EndProcedure
If AppInstanceExists()
MessageRequester("Info", "Programm läuft bereit - zweite Instanz wird beendet.")
End
Else
MessageRequester("Info", "Programm läuft noch nicht - dies ist die erste Instanz.")
EndIf
; !!! NICHT VERGESSEN !!! - Global Mutex wieder freigeben
CloseHandle_(g_hMutexAppRunning)
Dieses Beispiel einfach 2 mal ausführen (entweder direkt aus der IDE (OHNE Debugger) oder eben als EXE) und schauen was passiert.
Gruß, PL.
Re: Programm - nur eine Instanz erlauben
Verfasst: 11.11.2009 14:05
von X360 Andy
Was wäre wenn bei dem Code nun das Programm abstürzt ?
Dann würde ja CloseHandle_() nicht aufgerufen werden ... dann könnte man auch keine neue Instanz starten oder ?
Re: Programm - nur eine Instanz erlauben
Verfasst: 11.11.2009 14:44
von helpy
Einen wunderschönen guten Tag
X360 Andy hat geschrieben:Was wäre wenn bei dem Code nun das Programm abstürzt ?
Dann würde ja CloseHandle_() nicht aufgerufen werden ... dann könnte man auch keine neue Instanz starten oder ?
Siehe
MSDN-Beschreibung von CreateMutex:
...
Use the CloseHandle function to close the handle. The system closes the handle automatically when the process terminates. The mutex object is destroyed when its last handle has been closed.
...
cu, helpy
Re: Programm - nur eine Instanz erlauben
Verfasst: 11.11.2009 16:15
von Pelagio
Ich habe mir schon vor einiger Zeit eine Prozedur geschrieben die mir erlaubte vor dem Programmstart abzufragen ob schon eine Instanz des Programmes läuft und es hat mir gute Dienste geleistet.
Code: Alles auswählen
Procedure.a ProgramExists(ProgrammName.s)
CreateMutex_(0, 1, ProgrammName)
If (GetLastError_() = #ERROR_ALREADY_EXISTS)
ProcedureReturn #True
Else
ProcedureReturn #False
EndIf
EndProcedure
Re: Programm - nur eine Instanz erlauben
Verfasst: 11.11.2009 21:00
von Mr.Vain
Danke für den Code.
Wie mach ich das denn am besten?
-> Am besten wäre eine .exe Datei, die ich mit dem Programm starte:
"test.exe C:\temp\programm.exe"
Einmal starten -> erfolgreich
2. starten -> Fehlermeldung
Re: Programm - nur eine Instanz erlauben
Verfasst: 11.11.2009 21:51
von Kaeru Gaman
hä? wieso zweite exe?
das kommt einfach an den Anfang deines Programms rein, als abfrage, damit dein programm weiß dass es schon läuft.
Re: Programm - nur eine Instanz erlauben
Verfasst: 11.11.2009 22:34
von bobobo
Der obige Code kann nur verhindern dass Dein Programmstarter zweimal aufgerufen wird.
Das zweimalige Aufrufen des aufzurufenden Programms kannst Du durch Checken der Liste der laufenden
Prozesse oder über die der Fenster verhindern.
Ich mach sowas gerne mit Hilfe der Tools von Sysinternals (
http://www.sysinternals.com). Dort gibt es u.a. auch ein
pslist, welches die Prozesse listet.
Die Ausgabe analysieren auf Vorhandensein deines Programms (überlicherweise und häufig einfach der
Dateiname ohne Extension) und wenn da dann END und wenn nicht da dann starten.
Wenn Das gestartete Programm sich noch anders bemerkbar macht (Dateien Im TempVerzeichnis oder so)
dann könntest Du auch darüber Checken (Dateidatum).
siehe hier
http://www.purebasic.fr/german/viewtopi ... 13#p260313
Re: Programm - nur eine Instanz erlauben
Verfasst: 11.11.2009 22:36
von Mr.Vain
Vielen Dank !
Ich werd's mir morgen mal genauer anschauen.
Re: Programm - nur eine Instanz erlauben
Verfasst: 11.11.2009 22:41
von bobobo
beim Erstmaligen Aufruf von pslist will das Programm eine Absegnung der Lizenz. Danach ist dann aber Ruhe.