Autor Beitrag
derDoc
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 623

Win Vista Prof
D2007 Prof
BeitragVerfasst: 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



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 901



BeitragVerfasst: Sa 22.02.03 13:01 
Aus dem EDH2000 ein kleiner Ausschnitt

ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 623

Win Vista Prof
D2007 Prof
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 31

WinXP SP3, Win2000 SP4, Debian Sarge
D7 EE, D2006 PE, D2007 EE
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 612

WIN 2000, WIN XP, Mac OS X
D7 Enterprise, XCode, Eclipse, Ruby On Rails
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



BeitragVerfasst: 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 !

_________________
Gruß
Hansa