Paules-PC-Forum.de Anzeige:

Microsoft Windows Intune: PC-Verwaltung und -Sicherheit in der Cloud: Updateverwaltung, Anti-Virus und vieles mehr!


Zurück   Paules-PC-Forum.de > Programmierung > XProfan

XProfan Alles rund um die Programmiersprache XProfan.

EM-Tippspiel

Paule bei Facebook


Paule bei Twitter


Letzte Forenthemen
Gehe zum ersten neuen Beitrag Hamachi deinstallieren
Aufrufe: 58, Antworten: 5
Gehe zum ersten neuen Beitrag Bundesliga-Tippspiel Saision...
Aufrufe: 7670, Antworten: 187
Gehe zum ersten neuen Beitrag PPF - Spiel "Wörter weiter...
Aufrufe: 26970, Antworten: 4223
Gehe zum ersten neuen Beitrag PPF - Shoppingwahn
Aufrufe: 50963, Antworten: 1397
Gehe zum ersten neuen Beitrag Algorithmen Teil IV...
Aufrufe: 3361, Antworten: 128
Gehe zum ersten neuen Beitrag Pc lahmt plötzlich
Aufrufe: 186, Antworten: 6
Gehe zum ersten neuen Beitrag PC fährt nicht mehr hoch.
Aufrufe: 0, Antworten: 0
Gehe zum ersten neuen Beitrag Von Live CD Windowspfad...
Aufrufe: 329, Antworten: 19
Gehe zum ersten neuen Beitrag Captur 2.2 (Snow Leo)
Aufrufe: 28, Antworten: 0
Gehe zum ersten neuen Beitrag Captur 2.3 (Lion)
Aufrufe: 34, Antworten: 0
Zeige:





Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 08.06.2010, 11:59   #1 (Direktlink)
Weiß worum´s geht
 
Benutzerbild von JörgG
 
Registriert seit: 08.12.2009
Ort: Mecklenburg
Beiträge: 202
Standard Doppelten Programmstart verhindern

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
JörgG ist offline   Mit Zitat antworten
Werbung

Windows 7 Tipps und Tricks in Bildern

Alt 08.06.2010, 12:16   #2 (Direktlink)
AHT
Super-Moderator
 
Registriert seit: 15.02.2009
Beiträge: 10.786
Standard

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
AHT ist offline   Mit Zitat antworten
Alt 08.06.2010, 12:52   #3 (Direktlink)
Forenmaskottchen
 
Benutzerbild von Bangkok
 
Registriert seit: 09.02.2009
Ort: Bangkok
Beiträge: 686
Standard

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
Bangkok ist offline   Mit Zitat antworten
Alt 08.06.2010, 13:06   #4 (Direktlink)
AHT
Super-Moderator
 
Registriert seit: 15.02.2009
Beiträge: 10.786
Standard

Wo gab es bei dir Probleme mit einem Mutex?
__________________
______________

Bitte Schnelltest durchführen: Neuer Virus, ahnungslose User seit Monaten infiziert!

Mfg

AHT
AHT ist offline   Mit Zitat antworten
Alt 08.06.2010, 13:18   #5 (Direktlink)
AHT
Super-Moderator
 
Registriert seit: 15.02.2009
Beiträge: 10.786
Standard

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)
AHT ist offline   Mit Zitat antworten
Werbung

Windows 7 Tipps und Tricks in Bildern

Alt 08.06.2010, 13:30   #6 (Direktlink)
Weiß worum´s geht
 
Benutzerbild von JörgG
 
Registriert seit: 08.12.2009
Ort: Mecklenburg
Beiträge: 202
Standard

Joooooooo super! Gleich 2 Lösungen!
@AHT ja ja - die API....wie hast du denn das so schnell aus den Ärmel gezaubert - genial also liefert die API genau den Fehler 183, wenn der Mutex nicht erstellt werden konnte? Vermute mal, das im Erfogsfall die ProzessNr. zurückgeliefert wird...

@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... ;-)
JörgG ist offline   Mit Zitat antworten
Alt 08.06.2010, 13:40   #7 (Direktlink)
AHT
Super-Moderator
 
Registriert seit: 15.02.2009
Beiträge: 10.786
Standard

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:
Eine Datei kann nicht erstellt werden, wenn sie bereits vorhanden ist.
Feher 5:
Zitat:
Zugriff verweigert
Ansonsten 0:
Zitat:
Der Vorgang wurde erfolgreich beendet.
__________________
______________

Bitte Schnelltest durchführen: Neuer Virus, ahnungslose User seit Monaten infiziert!

Mfg

AHT

Geändert von AHT (08.06.2010 um 13:51 Uhr)
AHT ist offline   Mit Zitat antworten
Alt 08.06.2010, 14:10   #8 (Direktlink)
Weiß worum´s geht
 
Benutzerbild von JörgG
 
Registriert seit: 08.12.2009
Ort: Mecklenburg
Beiträge: 202
Standard

Ok - ich bau das ein & guck, was passiert
Vielen Dank für die Tips
JörgG ist offline   Mit Zitat antworten
Alt 08.06.2010, 14:45   #9 (Direktlink)
Super-Moderator
 
Benutzerbild von Jac de Lad
 
Registriert seit: 06.02.2009
Ort: Coswig
Alter: 27
Beiträge: 1.159
Standard

Ich benutz auch Mutex und hatte nie Probleme.
__________________
XProfan-Profi (XProfan X2+XPIA)
http://jacdelad.bplaced.net
http://jacdelad.square7.ch
Jac de Lad ist offline   Mit Zitat antworten
Alt 08.06.2010, 14:51   #10 (Direktlink)
Forenmaskottchen
 
Benutzerbild von Bangkok
 
Registriert seit: 09.02.2009
Ort: Bangkok
Beiträge: 686
Standard

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
Bangkok ist offline   Mit Zitat antworten
Werbung

Windows 7 Tipps und Tricks in Bildern

Alt 08.06.2010, 14:53   #11 (Direktlink)
AHT
Super-Moderator
 
Registriert seit: 15.02.2009
Beiträge: 10.786
Standard

@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
AHT ist offline   Mit Zitat antworten
Alt 08.06.2010, 14:58   #12 (Direktlink)
AHT
Super-Moderator
 
Registriert seit: 15.02.2009
Beiträge: 10.786
Standard

Zitat:
Zitat von Bangkok Beitrag anzeigen
Ich hatte Probleme, dass bei ca 5% der Starts der Mutex nicht erstellt wurde.
Ich überprüfe das mal - das Problem kenne ich nicht.

Zitat:
Zitat von Bangkok Beitrag anzeigen
@AHT: Sollte man nicht besser das Handle des Mutex mit der Api closehandle wieder schließen.
Nein, Kernelhandles sind prozessspezifisch. wird automatisch beim Beenden gekillt.
__________________
______________

Bitte Schnelltest durchführen: Neuer Virus, ahnungslose User seit Monaten infiziert!

Mfg

AHT
AHT ist offline   Mit Zitat antworten
Alt 08.06.2010, 15:06   #13 (Direktlink)
Super-Moderator
 
Benutzerbild von Jac de Lad
 
Registriert seit: 06.02.2009
Ort: Coswig
Alter: 27
Beiträge: 1.159
Standard

@Bangkok:
Zur Sicherheit release ich den Mutex immer vor Programmende mit
Code:
Def ReleaseMutex(1) !"kernel32","ReleaseMutex"
ReleaseMutex(handle&)
@AHT: Bitte Jac, nicht Jack. Solche speziellen Sachen habe ich noch nie ausprobiert. Ich starte meine Programme imme ganz normal und das hat noch nie Probleme gemacht.
__________________
XProfan-Profi (XProfan X2+XPIA)
http://jacdelad.bplaced.net
http://jacdelad.square7.ch
Jac de Lad ist offline   Mit Zitat antworten
Alt 08.06.2010, 16:35   #14 (Direktlink)
Ist öfter hier
 
Benutzerbild von Hallo1001
 
Registriert seit: 20.02.2009
Alter: 39
Beiträge: 71
Standard

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)
Hallo1001 ist offline   Mit Zitat antworten
Alt 08.06.2010, 16:51   #15 (Direktlink)
Forenmaskottchen
 
Benutzerbild von Bangkok
 
Registriert seit: 09.02.2009
Ort: Bangkok
Beiträge: 686
Standard

@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
Bangkok ist offline   Mit Zitat antworten
Werbung

Windows 7 Tipps und Tricks in Bildern

Antwort

  Paules-PC-Forum.de > Programmierung > XProfan

Lesezeichen

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen erlaubt, neue Themen zu verfassen.
Es ist Ihnen erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an


Ä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



Alle Zeitangaben in WEZ +2. Es ist jetzt 12:10 Uhr.


Powered by vBulletin® Version 3.8.7 (Deutsch)
Copyright ©2000 - 2012, vBulletin Solutions, Inc.
Powered by vBCMS® 2.7.0 ©2002 - 2012 vbdesigns.de
(c) Paules-PC-Forum.de

::: Impressum :::

Search Engine Optimization by vBSEO 3.3.2