Entwickler-Ecke
Windows API - Programm nicht mehrfach starten und bis auf 1 alle beenden
derDoc - Sa 22.02.03 11:43
Titel: Programm nicht mehrfach starten und bis auf 1 alle beenden
Kann mir jemand sagen, wie ich in meinem Programm überprüfe, ob es mehrfach ausgeführt ist, und wie ich dann alle bis auf eines beende?
Delete - Sa 22.02.03 12:18
Suchfunktion?
FAQ?
Im Beitrag zur UPX-Shell steht ein kleines, einfaches Beispiel. Grundsätzlich sorgst du dafür, dass dein Programm nur einmal gestartet werden kann. Das Zauber- und Suchwort heißt Mutex.
Startest du das Programm dann ein zweites Mal, wird festgestellt, dass der/das Mutex (?) bereits registriert ist. Du kannst dann entweder die zweite Instanz einfach beenden (unschön), oder du holst die bereits laufende Instanz in den Vordergrund (eleganter, & professioneller).
BungeeBug - Sa 22.02.03 13:01
Aus dem EDH2000 ein kleiner Ausschnitt
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20:
| Verhindern, das ein Programm mehrmals gestartet werden kann
Diese paar Zeilen Code verhindern, dass Dein Programm mehrmals gestartet werden kann. Schreibe dies ans Ende Deiner Unit (am Besten Unit des Hauptformulars):
Initialization mHandle:=CreateMutex(nil,True,'Programmname'); if GetLastError=ERROR_ALREADY_EXISTS then Halt;
finalization if mHandle<>0 then CloseHandle(mHandle)
end.
Du musst natürlich noch die globale Variable mHandle: THandle deklarieren (z.B. da wo Form1: TForm1 steht).
Als 'Programmname' kann eine beliebige Bezeichnung eingesetzt werden. |
MfG BungeeBug
derDoc - So 23.02.03 11:23
Danke Leute, ich werde das mal testen.
spaxxn - Mi 24.08.05 11:39
das diese variante "gefährlich" sein kann, wisst ihr aber oder?
wenn das programm nun z.b. abschmiert und den mutex nicht wieder freigibt, so kann das Programm in der aktuellen sitzung nicht mehr gestartet werden... :(
Stefan.Buchholtz - Mi 24.08.05 12:40
spaxxn hat folgendes geschrieben: |
das diese variante "gefährlich" sein kann, wisst ihr aber oder?
wenn das programm nun z.b. abschmiert und den mutex nicht wieder freigibt, so kann das Programm in der aktuellen sitzung nicht mehr gestartet werden... :( |
Nach meiner Erfahrung nicht - wenn das Programm, das den Mutex erzeugt hat, abschmiert, wird der Mutex vom System automatisch wieder freigegeben - genauso, wie offene Dateien und belegter Speicher vom System wieder geschlossen bzw. freigegeben werden, wenn ein Programm abstürzt. Das ist zumindest bei allen von Windows NT abstammenden Systemen so. Ob das auch für Windows 95/98/ME gilt, weiss ich nicht.
Stefan
hansa - Mi 24.08.05 13:10
spaxxn hat folgendes geschrieben: |
das diese variante "gefährlich" sein kann, wisst ihr aber oder?.. |
Ich habe die Mutexe auch in schlechter Erinnerung. Schaue Dir mal besser CreateSemaphore an. Das Ganze dreht sich allerdings zwangsläufig sowieso um Windows-Variablen. Bei den Semaphoren (auf deutsch : Signalflagge) sieht es jetzt so aus, daß Windows nachschaut, ob das Programm schon ausgeführt wird. Ist das der Fall, so mache ich es so, daß egal, ob in Taskleiste angeklickt, über Konsole gestartet wird usw. genau der Zustand des Programmes wieder hergestellt wird, wie er vorher war. Wenn ich also auf der 50. geöffneten Form stehe und der 30. Button dieser Form den Focus hat, dann lande ich wieder genau da !
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!