Programm - nur eine Instanz erlauben

Anfängerfragen zum Programmieren mit PureBasic.
Mr.Vain
Beiträge: 88
Registriert: 29.10.2009 00:14

Programm - nur eine Instanz erlauben

Beitrag 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
Benutzeravatar
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

Beitrag 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.
[Dynamic-Dialogs] - komplexe dynamische GUIs einfach erstellen
[DeFlicker] - Fenster flimmerfrei resizen
[WinFX] - Window Effekte (inkl. 'durchklickbares' Window)
Benutzeravatar
X360 Andy
Beiträge: 1206
Registriert: 11.05.2008 00:22
Wohnort: Bodensee
Kontaktdaten:

Re: Programm - nur eine Instanz erlauben

Beitrag 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 ?
Benutzeravatar
helpy
Beiträge: 635
Registriert: 29.08.2004 13:29

Re: Programm - nur eine Instanz erlauben

Beitrag 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
Windows 10
PB Last Final / (Sometimes testing Beta versions)
Benutzeravatar
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

Beitrag 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
Ohne Zeit kein Fleiß
Auf neustem Stand zu sein ist eine Kunst die nicht jeder perfektioniert [Win10Pro(64); PB6.10 LTS]. :allright:
Mr.Vain
Beiträge: 88
Registriert: 29.10.2009 00:14

Re: Programm - nur eine Instanz erlauben

Beitrag 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
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Re: Programm - nur eine Instanz erlauben

Beitrag 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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3857
Registriert: 13.09.2004 17:48
Kontaktdaten:

Re: Programm - nur eine Instanz erlauben

Beitrag 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
‮pb aktuell5.7 - windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Mr.Vain
Beiträge: 88
Registriert: 29.10.2009 00:14

Re: Programm - nur eine Instanz erlauben

Beitrag von Mr.Vain »

Vielen Dank !

Ich werd's mir morgen mal genauer anschauen.
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3857
Registriert: 13.09.2004 17:48
Kontaktdaten:

Re: Programm - nur eine Instanz erlauben

Beitrag von bobobo »

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.
Antworten