Programm - nur eine Instanz erlauben
Programm - nur eine Instanz erlauben
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
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
- PureLust
- Beiträge: 1145
- Registriert: 21.07.2005 00:02
- Computerausstattung: Hab aktuell im Grunde nur noch 'nen Lenovo Yoga 2 Pro im Einsatz.
- Wohnort: am schönen Niederrhein
Re: Programm - nur eine Instanz erlauben
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:
Dieses Beispiel einfach 2 mal ausführen (entweder direkt aus der IDE (OHNE Debugger) oder eben als EXE) und schauen was passiert.
Gruß, PL.
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)
Gruß, PL.
[Dynamic-Dialogs] - komplexe dynamische GUIs einfach erstellen
[DeFlicker] - Fenster flimmerfrei resizen
[WinFX] - Window Effekte (inkl. 'durchklickbares' Window)
[DeFlicker] - Fenster flimmerfrei resizen
[WinFX] - Window Effekte (inkl. 'durchklickbares' Window)
Re: Programm - nur eine Instanz erlauben
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 ?
Dann würde ja CloseHandle_() nicht aufgerufen werden ... dann könnte man auch keine neue Instanz starten oder ?
Re: Programm - nur eine Instanz erlauben
Einen wunderschönen guten Tag
Siehe MSDN-Beschreibung von CreateMutex: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 ?
cu, helpy...
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.
...
Windows 10
PB Last Final / (Sometimes testing Beta versions)
PB Last Final / (Sometimes testing Beta versions)
- Pelagio
- Beiträge: 424
- Registriert: 11.11.2004 17:52
- Computerausstattung: Intel Core i3-4170 CPU 3,70 GHz
8,00 GB Arbeitsspeicher
WIN 10 Pro 64 Bit Betriebssystem - Wohnort: Bremen
Re: Programm - nur eine Instanz erlauben
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
Ohne Zeit kein Fleiß
Auf neustem Stand zu sein ist eine Kunst die nicht jeder perfektioniert [Win10Pro(64); PB6.10 LTS].
Auf neustem Stand zu sein ist eine Kunst die nicht jeder perfektioniert [Win10Pro(64); PB6.10 LTS].
Re: Programm - nur eine Instanz erlauben
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
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
-
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
Re: Programm - nur eine Instanz erlauben
hä? wieso zweite exe?
das kommt einfach an den Anfang deines Programms rein, als abfrage, damit dein programm weiß dass es schon läuft.
das kommt einfach an den Anfang deines Programms rein, als abfrage, damit dein programm weiß dass es schon läuft.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Der Weise weiß, dass er ein Narr ist.
Re: Programm - nur eine Instanz erlauben
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
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
pb aktuell5.7 - windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Re: Programm - nur eine Instanz erlauben
Vielen Dank !
Ich werd's mir morgen mal genauer anschauen.
Ich werd's mir morgen mal genauer anschauen.
Re: Programm - nur eine Instanz erlauben
beim Erstmaligen Aufruf von pslist will das Programm eine Absegnung der Lizenz. Danach ist dann aber Ruhe.
pb aktuell5.7 - windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.