Italia
Fonte/ Codesnippets

Doppelstart Instanzen Mehrere Programmstarts Verhindern

 

Michael
Wodrich
Weil ich ein Weilchen brauchte, es aus dem Ärmel zu schütteln...
!
Keywords: mehrere Programmaufrufe/mehrere Instanzen/Mehrfachaufruf blocken/verhindern
Def $AppTitle "Mein Programmtitel"
Declare WindowHandle&
Window 100,100 - %Maxx-300,%Maxy-300
an dieser Stelle sollte noch kein Titel
definiert sein, sonst gehts schief
WindowHandle& = FindWindow($AppTitle)

if WindowHandle& <> 0

    print "Huch, ich bin ja schon da."
    print "Nach Tastendruck wird auf die 1. Instanz umgeschaltet."
    waitinput
    ShowWindow(WindowHandle&, 1)  evtl. verstecktes Fenster wieder aktivieren
    SetWindowPos WindowHandle& = 100,100 - %Maxx-300,%Maxy-300; 0  in den Vordergrund holen
    end  ...und die 2. Instanz beenden

else

    print "Ich bin einmalig."

endif

erst nach der Abprüfung wird der Fenstertitel gesetzt.
WindowTitle $AppTitle
waitkey
end

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.
Def CreateMutex(3) !"KERNEL32","CreateMutexA"
def GetLastError(0) !"KERNEL32.dll","GetLastError"

proc check_doppelstart    return ist 0 wenn doppelstart vorliegt

    Parameters name$           Mutexname
    declare mutex&,error&
    name$  = translate$(name$ ,"\","/")   hab ich irgendwo gelesen, daß / verboten sind
    mutex& = CreateMutex(0,1,addr(name$))
    error& = GetLastError()
    print error&

    if error& = 183

        return 0

    endif

    return 1

endproc

print check_doppelstart("test")
print check_doppelstart("test")
print check_doppelstart("c:\testAaaaaaaaaaaaaaaaaa")
print check_doppelstart("c:\testAaaaaaaaaaaaaaaaaa")
waitinput

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.
 
07.09.2006  
 



Das Einfachste:
 $U pipe.pcu = pipe.
declare pipe&
case pipe.is("odoku") : end
pipe&:=pipe.create("odoku")
cls
waitinput
pipe.close pipe&
 
07.09.2006  
 




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 trasferimento 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 corre 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 per 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
 
07.09.2006  
 



Gute Idee! Und hier das Selbe nur kürzer und ohne nötige Headerfiles:
 
07.09.2006  
 




Jac
de
Lad
Ich finde die beste Methode ist immer noch per Mutex:
Def CreateMutex(3) !"KERNEL32","CreateMutexA"
Def GetLastError(0) !"KERNEL32","GetLastError"
CreateMutex(0,1,"PROGRAMM")
case Equ(GetLastError(),183):end

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 possibile sein.
per 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 corsa wird (z.b. eine einplatzlizenz).

r.r.
 
08.09.2006  
 



Zum Quelltext


Topictitle, max. 100 characters.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Posting  Font  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Topic-Options

9.571 Views

Untitledvor 0 min.
RudiB.28.08.2022
RICOSCH09.05.2019
AndreasS26.12.2018
PETER195618.07.2018
Di più...

Themeninformationen



Admins  |  AGB  |  Applications  |  Autori  |  Chat  |  Informativa sulla privacy  |  Download  |  Entrance  |  Aiuto  |  Merchantportal  |  Impronta  |  Mart  |  Interfaces  |  SDK  |  Services  |  Giochi  |  Cerca  |  Support

Ein Projekt aller XProfaner, die es gibt!


Il mio XProfan
Private Notizie
Eigenes Ablageforum
Argomenti-Merkliste
Eigene Beiträge
Eigene Argomenti
Zwischenablage
Annullare
 Deutsch English Français Español Italia
Traduzioni

Informativa sulla privacy


Wir verwenden Cookies nur als Session-Cookies wegen der technischen Notwendigkeit und bei uns gibt es keine Cookies von Drittanbietern.

Wenn du hier auf unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung von Informationen in unseren Cookies auf XProfan.Net zu.

Weitere Informationen zu unseren Cookies und dazu, wie du die Kontrolle darüber behältst, findest du in unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Ich möchte keinen Cookie