Seite 2 von 2

Re: Anzahl gleichzeitiger Starts eigener Programme beschränk

Verfasst: 08.04.2012 09:12
von Nino
Danilo hat geschrieben:Ich habe bisher davon auch keine Ahnung (deshalb das "scheinbar", Nino ;)),
... und genau in solch einem Zusammenhang ist "scheinbar" eben falsch, weil dieses Wort nur benutzt wird, wenn man sicher ist, dass eine Sache nicht so ist, wie sie flüchtig betrachtet zu sein scheint. I. Ggs. dazu drückt "anscheinend" aus, dass man sich diesbezüglich nicht festlegen kann oder will.

Ist nicht böse und auch nicht persönlich gemeint. Ich habe (auch hier) die falsche Verwendung von "scheinbar" einfach nur ein paar Dutzend mal zu oft gelesen. :-)

Grüße, Nino

Re: Anzahl gleichzeitiger Starts eigener Programme beschränk

Verfasst: 09.04.2012 20:27
von TheCube
Danilo hat geschrieben: Genau dazu sind die Flags bei Dr. Newcomers Code da:

Code: Alles auswählen

SI_SESSION_UNIQUE                        - Allow one instance per login session
SI_DESKTOP_UNIQUE                        - Allow one instance per desktop
SI_TRUSTEE_UNIQUE                        - Allow one instance per user account
SI_SESSION_UNIQUE | SI_DESKTOP_UNIQUE    - Allow one instance per login session,
                                           instances in different login sessions
                                           must also reside on a different desktop
SI_TRUSTEE_UNIQUE | SI_DESKTOP_UNIQUE    - Allow one instance per user account,
                                           instances in login sessions running a
                                           different user account must also reside    
                                           on different desktops.
SI_SYSTEM_UNIQUE                         - Allow only one instance on the whole system
Siehe letztes Flag, SI_SYSTEM_UNIQUE.
Das sollte man dann auch genauso für Deine benannte Semaphore umsetzen können,
da es in dem Code letztendlich nur um die Erzeugung von eindeutigen Namen geht (statt CreateXXX_(0,0,@"MeinProgramm1.0")).
Ja, so habe ich es irgentwann auch verstanden, hauptsache per GUID-Erzeugung,"createExclusionName", usw. einen nach Bedarf einmaligen Namen erzeugen.
Und dann ?
Dr. Joseph M. Newcomer hat geschrieben:The CreateMutex() call fails with ERROR_ACCESS_DENIED if the Mutex was created in another user's session.
This comes from passing NULL for the SECURITY_ATTRIBUTES which results in default security settings.
The typical default DACL allows only CREATOR/OWNER and SYSTEM access to the object.
Das war ja schnell ausprobiert ... (ich belasse es hier mal bei dem nicht empfehlenswerten Primitivnamen)

Code: Alles auswählen

MutexName$ = "MeinProgramm1.0" : hMutex = CreateMutex_(0, 0, @MutexName$)  ; Zweite 0 auch testweise 1
Lerr=GetLastError_()
If Lerr = #ERROR_ALREADY_EXISTS : End : EndIf
If Lerr = #ERROR_ACCESS_DENIED  : End : EndIf
;Code folgend ...
Leider laufen auch weiterhin unter jedem User (1xAdmin, 2x Standarduser) gleichzeitig meine EXEn.
Also über ein kleines Beispiel für einen gesamtsystemweiten Mutex würde ich mich freuen :) Hab´s wohl nur scheinbar verstanden :lol:

Re: Anzahl gleichzeitiger Starts eigener Programme beschränk

Verfasst: 09.04.2012 23:43
von Danilo
TheCube hat geschrieben:

Code: Alles auswählen

MutexName$ = "MeinProgramm1.0" : hMutex = CreateMutex_(0, 0, @MutexName$)  ; Zweite 0 auch testweise 1
Lerr=GetLastError_()
If Lerr = #ERROR_ALREADY_EXISTS : End : EndIf
If Lerr = #ERROR_ACCESS_DENIED  : End : EndIf
;Code folgend ...
Leider laufen auch weiterhin unter jedem User (1xAdmin, 2x Standarduser) gleichzeitig meine EXEn.
Also über ein kleines Beispiel für einen gesamtsystemweiten Mutex würde ich mich freuen :) Hab´s wohl nur scheinbar verstanden :lol:
Probier es mal mit MutexName$ = "Global\MeinProgramm1.0", sollte dann gehen.

Re: Anzahl gleichzeitiger Starts eigener Programme beschränk

Verfasst: 10.04.2012 00:30
von TheCube
Danilo hat geschrieben:Probier es mal mit MutexName$ = "Global\MeinProgramm1.0", sollte dann gehen.
Funktioniert hervorragend, danke ! :allright: Da hat Dr. Newcomer aber nix von gesagt (?)

Hier als CutCopyPaste komplett für Gegentests:

Code: Alles auswählen

MutexName$ = "Global\MeinProgramm1.0" : hMutex = CreateMutex_(#Null, 0, @MutexName$)
Lerr=GetLastError_()
If Lerr = #ERROR_ALREADY_EXISTS 
  MessageRequester("Achtung:", " Dieses Programm wurde schon gestartet !", #MB_ICONSTOP) : End
EndIf 
If Lerr = #ERROR_ACCESS_DENIED 
  MessageRequester("Achtung:", " Dieses Programm wurde unter einem anderen User schon gestartet !", #MB_ICONSTOP) : End
EndIf 

hwnd = OpenWindow(0,#PB_Ignore,#PB_Ignore,200,100,"Test - Systemglobal Mutex")
Repeat :  Until WaitWindowEvent() = #PB_Event_CloseWindow

Und für die Experten gehts hier weiter: http://forums.purebasic.com/german/view ... 36e900e15e

Re: Anzahl gleichzeitiger Starts eigener Programme beschränk

Verfasst: 10.04.2012 00:52
von Danilo
TheCube hat geschrieben:Da hat Dr. Newcomer aber nix von gesagt (?)
Das steht in der MSDN-Hilfe für CreateMutex_(). :)

Noch mal zurück zu den Semaphoren ...

Verfasst: 18.04.2012 22:34
von TheCube
In dem Codebeispiel von meinem ersten Post steht in den letzten Zeile

Code: Alles auswählen

WaitForSingleObject_(*SHnd,1) : CloseHandle_(*SHnd)
womit es ja auch funktioniert. Schreibe ich aber Debug davor und kompiliere meine Test.exe damit

Code: Alles auswählen

Debug WaitForSingleObject_(*SHnd,1) : CloseHandle_(*SHnd)
scheint das wiederrunterzählen der Semaphore beim Schliessen einer Test.exe nicht zu klappen.
Effekt: Ich kann das Programm nur 3x starten, dann muss ich erst *alle* Programmfenster schliessen, sonst gibt es die "zu oft gestartet"-Meldung.
Diese Varianten dagegen funktionieren :

Code: Alles auswählen

MessageRequester("Info:", Str(WaitForSingleObject_(*SHnd,0))) : CloseHandle_(*SHnd)
oder
x=WaitForSingleObject_(*SHnd,0) : Debug x : CloseHandle_(*SHnd)
Kann man das irgentwie erklären ? :freak:

P.S.: @Danilo
Du hast recht: PrgName.s = "Global\MeinProgramm1.0" macht auch Semaphoren systemweit, funktioniert aber nach ersten Tests nicht bei zwei Usern unterschiedlicher Rechte. (z.B. 1xAdmin, 1xStandard)
Hat einer der beiden eine Instanz offen, kann der andere die Semaphore nicht öffnen oder erstellen. Vielleicht eine Win7 oder UAC Sache, ich weiss es nicht. FYI.