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

user profile iconspaxxn 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

user profile iconspaxxn 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 !