Aktuelle Zeit: 19.05.2013 03:54

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]




Ein neues Thema erstellen Auf das Thema antworten  [ 16 Beiträge ]  Gehe zu Seite Vorherige  1, 2
Autor Nachricht
 Betreff des Beitrags: Re: Anzahl gleichzeitiger Starts eigener Programme beschränk
BeitragVerfasst: 08.04.2012 09:12 
Offline

Registriert: 13.05.2010 09:26
Wohnort: Berlin
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


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Anzahl gleichzeitiger Starts eigener Programme beschränk
BeitragVerfasst: 09.04.2012 20:27 
Offline
Benutzeravatar

Registriert: 20.07.2010 23:59
Wohnort: NRW
Danilo hat geschrieben:
Genau dazu sind die Flags bei Dr. Newcomers Code da:
Code:
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:
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:


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Anzahl gleichzeitiger Starts eigener Programme beschränk
BeitragVerfasst: 09.04.2012 23:43 
Offline
-= Anfänger =-
Benutzeravatar

Registriert: 29.08.2004 03:07
TheCube hat geschrieben:
Code:
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.

_________________
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Anzahl gleichzeitiger Starts eigener Programme beschränk
BeitragVerfasst: 10.04.2012 00:30 
Offline
Benutzeravatar

Registriert: 20.07.2010 23:59
Wohnort: NRW
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:
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/viewtopic.php?f=8&t=25406&sid=47e5c1704cf63728e4001736e900e15e


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Anzahl gleichzeitiger Starts eigener Programme beschränk
BeitragVerfasst: 10.04.2012 00:52 
Offline
-= Anfänger =-
Benutzeravatar

Registriert: 29.08.2004 03:07
TheCube hat geschrieben:
Da hat Dr. Newcomer aber nix von gesagt (?)

Das steht in der MSDN-Hilfe für CreateMutex_(). :)

_________________
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck


Nach oben
 Profil  
 
 Betreff des Beitrags: Noch mal zurück zu den Semaphoren ...
BeitragVerfasst: 18.04.2012 22:34 
Offline
Benutzeravatar

Registriert: 20.07.2010 23:59
Wohnort: NRW
In dem Codebeispiel von meinem ersten Post steht in den letzten Zeile
Code:
WaitForSingleObject_(*SHnd,1) : CloseHandle_(*SHnd)
womit es ja auch funktioniert. Schreibe ich aber Debug davor und kompiliere meine Test.exe damit
Code:
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:
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.


Nach oben
 Profil  
 
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 16 Beiträge ]  Gehe zu Seite Vorherige  1, 2

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 0 Gäste


Sie dürfen keine neuen Themen in diesem Forum erstellen.
Sie dürfen keine Antworten zu Themen in diesem Forum erstellen.
Sie dürfen Ihre Beiträge in diesem Forum nicht ändern.
Sie dürfen Ihre Beiträge in diesem Forum nicht löschen.

Suche nach:
Gehe zu:  

 


Powered by phpBB © 2008 phpBB Group | Deutsche Übersetzung durch phpBB.de
subSilver+ theme by Canver Software, sponsor Sanal Modifiye