![]() |
Anzeige:
|
|
|||||||
| XProfan Alles rund um die Programmiersprache XProfan. |
|
![]() |
|
|
LinkBack | Themen-Optionen | Ansicht |
|
|
#1 (Direktlink) |
|
Weiß worum´s geht
![]() Registriert seit: 08.12.2009
Ort: Mecklenburg
Beiträge: 202
|
Hi Leute,
jetzt möchte ich verhindern, das mein Prog. 2x gestartet wird (Katastrophe). Deshalb suchte ich hier & in der Hilfe & im I-net ganz gezielt nach diesem Problem. In einigen Foren war von der Erstellung eines Mutex die Rede; kann er erstellt werden ist alles OK, wenn nicht, ist er bereits vorhanden (sprich, das Prog ist bereits gestartet) - Also genau das, was ich brauche. Nun habe ich (bis jetzt) vergeblich nach einer ähnlichen Funktionalität im Profan-Funktionsumfang gesucht, aber vllt. heißt die auch ganz anders, als ich erwarte. Könnt ihr mich da ein wenig auf die Sprünge helfen, in welche Richtung ich da stöbern bzw. ansetzen kann? Danke & viele Grüße Jörg |
|
|
|
|
|
|
#2 (Direktlink) |
|
Super-Moderator
![]() Registriert seit: 15.02.2009
Beiträge: 10.786
|
Code:
Def Createmutex(3) !"KERNEL32","CreateMutexA"
Def Getlasterror(0) !"KERNEL32.dll","GetLastError"
IF Check_doppelstart("Testprogramm für Mutex")=0
end
endif
Windowstyle 31
Windowtitle "Nur einmal starten!"
window 0,0-640,440
While 1
waitinput
Endwhile
Proc Check_doppelstart ' return ist 0 wenn doppelstart vorliegt
Parameters Name$ ' Mutexname
Declare Mutex&,Error&
Name$ = Translate$(Name$ ,"\\","/")
Mutex& = Createmutex(0,1,Addr(Name$))
Error& = Getlasterror()
If Error& = 183
Return 0
Endif
Return 1
Endproc
__________________
______________ Bitte Schnelltest durchführen: Neuer Virus, ahnungslose User seit Monaten infiziert! Mfg AHT |
|
|
|
|
|
#3 (Direktlink) |
|
Forenmaskottchen
![]() Registriert seit: 09.02.2009
Ort: Bangkok
Beiträge: 686
|
Ich verlasse mich bei neueren Windows Versionen nicht mehr so toll auf den Mutex, da er mich schon oft im Stich gelassen hat. Ein vielleicht besserer Weg. Ich benenne mein Programm beim Starten mit irgend einem Namen z.B. "X_Y_Z=0" Suche dann mit Findwindow("mein Programmname") nach dem richtigen Namen des Programmes, wenn kein Handle zurück gegeben wird, benenne ich es dann um in den richtigen Namen und starte es. Im Falle eines Handles beende ich es. Hat nur den Nachteil wenn ein anderes Programm mit diesem Namen läuft, geht es schief. Läßt sich aber umgehen mit irgendeinem speziellen Zeichen im Namen.
__________________
Er ist ein Mann wie ein Baum. Sie nennen ihn Bonsai. http://dieterzornow.gmxhome.de |
|
|
|
|
|
#4 (Direktlink) |
|
Super-Moderator
![]() Registriert seit: 15.02.2009
Beiträge: 10.786
|
Wo gab es bei dir Probleme mit einem Mutex?
__________________
______________ Bitte Schnelltest durchführen: Neuer Virus, ahnungslose User seit Monaten infiziert! Mfg AHT |
|
|
|
|
|
#5 (Direktlink) |
|
Super-Moderator
![]() Registriert seit: 15.02.2009
Beiträge: 10.786
|
Aufgrund des ILs und der Zugriffsrechte kann es da Probleme geben, wenn man keinen Security Descriptor für das Mutex festlegt. Hier neuer Vorschlag, müsste ausgetestet werden, ob er in allen Lebenslagen geht:
Code:
'##################################################################################### '######### Code von AHT ######### '######### Gepostet für http://www.paules-pc-forum.de ######### '##################################################################################### Def Createmutex(3) !"KERNEL32","CreateMutexA" Def Getlasterror(0) !"KERNEL32.dll","GetLastError" Def Setlasterror(1) !"KERNEL32.dll","SetLastError" IF Check_doppelstart("Testprogramm für Mutex")=0 end endif Windowstyle 31 Windowtitle "Nur einmal starten!" window 0,0-640,440 While 1 waitinput Endwhile Proc Check_doppelstart ' return ist 0 wenn doppelstart vorliegt Parameters Name$ ' Mutexname Declare Mutex&,Error& Name$ = Translate$(Name$ ,"\\","/") Setlasterror(0) Mutex& = Createmutex(0,1,Addr(Name$)) Error& = Getlasterror() 'Print Error& If Error& = 183 Return 0 Elseif Error& = 5 Return 0 Endif Return 1 Endproc
__________________
______________ Bitte Schnelltest durchführen: Neuer Virus, ahnungslose User seit Monaten infiziert! Mfg AHT Geändert von AHT (08.06.2010 um 13:28 Uhr) |
|
|
|
|
|
|
#6 (Direktlink) |
|
Weiß worum´s geht
![]() Registriert seit: 08.12.2009
Ort: Mecklenburg
Beiträge: 202
|
Joooooooo super! Gleich 2 Lösungen!
@AHT ja ja - die API....wie hast du denn das so schnell aus den Ärmel gezaubert - genial @Bangkok pfiffige Alternative, spontan tut sich bei mir die Frage auf, wie man zur Laufzeit eines Progs seinen Namen ändern kann, oder ich müßte so eine Art seperates Startprogramm basteln, welches schaut ob das Hauptprog als Fenster vorhanden ist? Alles Klar - ich erstelle ja ein Fenster mit einem beliebigen Namen.... Jetzt hab ich's gescheckt... Geändert von JörgG (08.06.2010 um 14:04 Uhr) Grund: Nicht nachgedacht... ;-) |
|
|
|
|
|
#7 (Direktlink) | |||
|
Super-Moderator
![]() Registriert seit: 15.02.2009
Beiträge: 10.786
|
Verwende den letzten Code, der erste wird nicht funktionieren, wenn das Programm zuerst mit Adminrechten und danach geringer priveligiert gestartet wird.
Wird das Programm mit Adminrechten gestartet, wird dem Mutex eine Standard Sicherheitsbeschreibung verliehen (wird aus dem Default DACL des Prozesses genommen, der das Mutex erzeugt), und ein niedriger priveligierter Prozess hat dann keinen Zugriff auf das Mutex. Fehler 183: Zitat:
Zitat:
Zitat:
__________________
______________ Bitte Schnelltest durchführen: Neuer Virus, ahnungslose User seit Monaten infiziert! Mfg AHT Geändert von AHT (08.06.2010 um 13:51 Uhr) |
|||
|
|
|
|
|
#8 (Direktlink) |
|
Weiß worum´s geht
![]() Registriert seit: 08.12.2009
Ort: Mecklenburg
Beiträge: 202
|
Ok - ich bau das ein & guck, was passiert
Vielen Dank für die Tips |
|
|
|
|
|
#9 (Direktlink) |
|
Super-Moderator
![]() Registriert seit: 06.02.2009
Ort: Coswig
Alter: 27
Beiträge: 1.159
|
Ich benutz auch Mutex und hatte nie Probleme.
__________________
XProfan-Profi (XProfan X2+XPIA) http://jacdelad.bplaced.net http://jacdelad.square7.ch |
|
|
|
|
|
#10 (Direktlink) |
|
Forenmaskottchen
![]() Registriert seit: 09.02.2009
Ort: Bangkok
Beiträge: 686
|
Ich hatte Probleme, dass bei ca 5% der Starts der Mutex nicht erstellt wurde.
@AHT: Sollte man nicht besser das Handle des Mutex mit der Api closehandle wieder schließen. @Jörg: Ein Startprogramm braucht man nicht es reicht schon am Anfang Code:
If Findwindow("Mein Programmname") = 0
settext %hwnd,"Mein Programmname"
else
end
endif
__________________
Er ist ein Mann wie ein Baum. Sie nennen ihn Bonsai. http://dieterzornow.gmxhome.de |
|
|
|
|
|
|
#11 (Direktlink) |
|
Super-Moderator
![]() Registriert seit: 15.02.2009
Beiträge: 10.786
|
@Jack:
Compilere mal den ersten Quelltext und starte ihn mit Adminrechten. Starte danach den ersten Quelltext nochmals so, das er in einem Integritätslevel "niedrige Verbindlichkeitsstufe" läuft (geht hiermit ganz gut). Was erkennts du? Warum das so ist, lässt sich recht einfach erklären.
__________________
______________ Bitte Schnelltest durchführen: Neuer Virus, ahnungslose User seit Monaten infiziert! Mfg AHT |
|
|
|
|
|
#12 (Direktlink) | |
|
Super-Moderator
![]() Registriert seit: 15.02.2009
Beiträge: 10.786
|
Zitat:
Nein, Kernelhandles sind prozessspezifisch. wird automatisch beim Beenden gekillt.
__________________
______________ Bitte Schnelltest durchführen: Neuer Virus, ahnungslose User seit Monaten infiziert! Mfg AHT |
|
|
|
|
|
|
#13 (Direktlink) |
|
Super-Moderator
![]() Registriert seit: 06.02.2009
Ort: Coswig
Alter: 27
Beiträge: 1.159
|
@Bangkok:
Zur Sicherheit release ich den Mutex immer vor Programmende mit Code:
Def ReleaseMutex(1) !"kernel32","ReleaseMutex" ReleaseMutex(handle&)
__________________
XProfan-Profi (XProfan X2+XPIA) http://jacdelad.bplaced.net http://jacdelad.square7.ch |
|
|
|
|
|
#14 (Direktlink) |
|
Ist öfter hier
![]() Registriert seit: 20.02.2009
Alter: 39
Beiträge: 71
|
Hallo Jörg!
Ich habe das Problem bei mir über einen gemeinsamen Speicherbereich gelöst. Beim Programmstart wir der Handel in den Speicher geschrieben. Startet das Programm dann noch einmal, wird erst der Speicher abgefragt und ist der Handel noch vorhanden, dann wird das neue Programm an der Stelle beendet. Anbei mal ein kleines Test-Progi dazu, vielleicht kannst Du es ja gebrauchen... LG Jens Code:
$H Windows.ph ' Headerdatei laden
Proc Memory
Parameters Tmp_SizeOfMem& ' Übergabe - Größe des Speicherplatzes
Var Tmp_hMap& = ~CreateFileMapping(-1,0,~PAGE_READWRITE,0,Tmp_SizeOfMem&,"Mein_Test") ' Speicherbereich anlegen
Var Tmp_hMapView& = ~MapViewOfFile(Tmp_hMap&,$000F001F,0,0,0) ' Zeiger vom Speicherbereich ermitteln
Return Tmp_hMapView& ' Handel zurück geben
EndProc
' Memory Speicher erstellen
Var Zeiger_Mem& = Memory(256) ' Speicherplatz bereitstellen und Handel ermitteln
' Handel des letzten Programmstarts einlesen
Var Progi& = @Long(Zeiger_Mem&,0) ' Handel der vorigen Sitzung aus Memory einlesen
' Überprüfe ob dass vorige Progi noch läuft
IfNot ~IsWindow(Progi&) = 0 ' wenn dass vorige Programm noch läuft, dann...
' Meldung im Memory hinterlegen
Long Zeiger_Mem&,4 = 1 ' Meldung hinterlegen
@SendKey(Progi&,13) ' Sende Enter an vorige AVR-Brenner Sitzung
' Memory Speicher freigeben
~UnmapViewOfFile(Zeiger_Mem&) ' Speicherbereich abmelden
~CloseHandle(Zeiger_Mem&) ' Bereitstellung beenden
End ' Neue Sitzung beenden
EndIf
'------------------------------------------------
CLS
' Handel des aktuellen Programms sichern
Long Zeiger_Mem&,0 = %hWnd ' Handel Hauptfenster im Memory hinterlegen
Print "Fenster mit Handel: "+str$(%hWnd)
Var Ende% = 0 ' Endlosschleife einstellen
WhileNot Ende% ' Beginn Endlosschleife
WaitInput ' warten auf Eingabe (Mausklick)
If (%Key = 2) or (%Key = 27) ' wenn X-Button oder ESC ausgewählt wurde, dann...
Ende% = 1 ' Programm Ende
EndIf
EndWhile ' Ende Endlosschleife
'------------------------------------------------
' Memory Speicher freigeben
~UnmapViewOfFile(Zeiger_Mem&) ' Speicherbereich abmelden
~CloseHandle(Zeiger_Mem&) ' Bereitstellung beenden
end
Geändert von Hallo1001 (08.06.2010 um 23:59 Uhr) |
|
|
|
|
|
#15 (Direktlink) |
|
Forenmaskottchen
![]() Registriert seit: 09.02.2009
Ort: Bangkok
Beiträge: 686
|
@AHT: deinen zweiten Vorschlag kann ich unbegrenzt oft starten, geht also garnicht
Win 7
__________________
Er ist ein Mann wie ein Baum. Sie nennen ihn Bonsai. http://dieterzornow.gmxhome.de |
|
|
|
|
![]() |
|
| Lesezeichen |
| Themen-Optionen | |
| Ansicht | |
|
|
Ähnliche Themen
|
||||
| Thema | Autor | Forum | Antworten | Letzter Beitrag |
| XP Wiederherstellung verbraucht doppelten Speicherplatz? | Mäuschen86 | Windows XP | 6 | 23.01.2009 14:00 |
| Wo aktiviere ich den automatischen Programmstart des CD-LW | Otto | Windows XP | 1 | 12.02.2007 08:30 |
| Programmstart dauert ewig | Pockebrd | Software - Allgemein | 2 | 30.01.2005 13:14 |
| programmstart win2000 | Dano | Windows 95/98/ME/2000/NT | 6 | 15.10.2004 19:17 |
| Fehlermeldung nach Programmstart | duke65 | Windows XP | 6 | 03.12.2003 12:23 |