Autor |
Beitrag |
derDoc
      
Beiträge: 623
Win Vista Prof
D2007 Prof
|
Verfasst: Sa 22.02.03 11:43
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?
_________________ MfG derDoc
There are only 10 types of people: those who understand binary and those who don't.
|
|
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: 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
      
Beiträge: 901
|
Verfasst: 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 
      
Beiträge: 623
Win Vista Prof
D2007 Prof
|
Verfasst: So 23.02.03 11:23
Danke Leute, ich werde das mal testen.
_________________ MfG derDoc
There are only 10 types of people: those who understand binary and those who don't.
|
|
spaxxn
      
Beiträge: 31
WinXP SP3, Win2000 SP4, Debian Sarge
D7 EE, D2006 PE, D2007 EE
|
Verfasst: 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
      
Beiträge: 612
WIN 2000, WIN XP, Mac OS X
D7 Enterprise, XCode, Eclipse, Ruby On Rails
|
Verfasst: 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
      
Beiträge: 3079
Erhaltene Danke: 9
|
Verfasst: 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 !
_________________ Gruß
Hansa
|
|
|