| |
|
|
Michael Wodrich | Weil ich ein Weilchen brauchte, es aus dem Ärmel zu schütteln...
Schöne Grüße Michael Wodrich |
|
|
| Programmieren, das spannendste Detektivspiel der Welt. | 07.09.2006 ▲ |
|
|
|
|
Michael Wodrich | Und nach Hinweis von TS-Soft noch eine Mutex-Variante aus dem Phorum von Ragnar Rehbein.
Gibts noch weitere Möglichkeiten?
Schöne Grüße Michael Wodrich |
|
|
| Programmieren, das spannendste Detektivspiel der Welt. | 07.09.2006 ▲ |
|
|
|
|
| [quote:1532fb2073=Michael Wodrich] Gibts noch weitere Möglichkeiten?
Schöne Grüße Michael Wodrich[/quote:1532fb2073] Klar CreateSemaphore(...) z.B. findeste irgendwo in MSDN oder PSDK Ist aber dem Mutex nicht unähnlich. Für den Mutexstring verwende ich meist eine GUID. |
|
|
| |
|
|
|
| |
|
| |
|
|
|
Uwe ''Pascal'' Niemeier | Hallo Leute!
Hier noch eine Möglichkeit per FileMapping. Dabei wird nicht nur die neue Instanz automatisch beendet, sondern auch die laufende Instanz per Usermmessage informiert, sodass sie sich gegebenenfalls in den Vordergrund setzen kann. Das Prinzip kann man derart erweitern, dass mögliche Parameter, die bei Aufruf der 2. Instanz übergeben werden, an die 1.Instanz weitergereicht werden.
!
$H Messages.ph
$H Windows.ph
declare MapHandle&,ViewHandle&
MapHandle&=~OpenFileMapping(~FILE_MAP_ALL_ACCESS,0,"Programm 1.1")
if MapHandle&--MappedFile vorhanden (enthält %hwnd von bereits laufender Instanz)
ViewHandle&=~MapViewOfFile(MapHandle&,~FILE_MAP_ALL_ACCESS,0,0,32)
messagebox("Programm läuft bereits","Meldung",0)
sendmessage(long(ViewHandle&,0),5066,0,0)--Message an 1. Instanz
~UnmapViewOfFile(ViewHandle&)
end
else--Diese Instant ist die erste > MappedFile anlegen!
MapHandle&=~CreateFileMapping($FFFFFFFF,0,~PAGE_READWRITE,0,32,"Programm 1.1")
ViewHandle&=~MapViewOfFile(MapHandle&,~FILE_MAP_WRITE,0,0,32)
window 100,100-600,400----erst hier wird das Fenster erzeugt!!
long ViewHandle&,0=%hwnd--Handle in MappedFile schreiben
endif
usermessages 16----WM_CLOSE
usermessages 5066--Irgendein Wert, der hoch genug ist für selbstdefinierte Msg.
while 1------------Eingabeschleife
waitinput
case %umessage=16:break--Ende
if %umessage=5066--------Usermessage von neuer Instanz
shownormal
setactivewindow(%hwnd)
setfocus(%hwnd)
print "Aktivierung durch neue Instanz"
endif
----Weitere Eingabeabfragen
endwhile
--Sollte bei Ende erreicht werden:
~UnmapViewOfFile(ViewHandle&)
~CloseHandle(MapHandle&)
HTH Pascal |
|
|
| |
|
|
|
| Gute Idee! Und hier das Selbe nur kürzer und ohne nötige Headerfiles:
|
|
|
| |
|
|
|
Jac de Lad | Ich finde die beste Methode ist immer noch per Mutex:
Jac |
|
|
| Profan² 2.6 bis XProfan 11.1+XPSE+XPIA+XPRR (und irgendwann XIDE) Core2Duo E8500/T2250, 8192/1024 MB, Radeon HD4850/Radeon XPress 1250, Vista64/XP | 07.09.2006 ▲ |
|
|
|
|
Ragnar Rehbein | ich benutze als mutexnamen (bzw. bei filemapping) inzwischen bei fast allen programmen par$(0), also den programmnamen inkl. pfad. aber aufpassen, daß der backslsh raustranslatet wird! ich habe fast immer die anforderung, daß ein programm nicht doppelt gestartet werden kann, ein start unterschiedlicher konfigurationen aus verschiedenen verzeichnissen bzw. durch umbenenn des programms soll möglich sein. für terminalserverumgebungen ist noch der präfix Global und Local interessant (hier muß der backslash beiben!). damit kann z.b. verhindert werden, daß ein programm in mehreren sitzungen ausgeführt wird (z.b. eine einplatzlizenz).
r.r. |
|
|
| |
|
|