.EXE nur 1x starten
Moderator: Moderatoren
.EXE nur 1x starten
Ich würde gerne, dass das .exe vom Benutzer nur 1x pro Rechner gestartet werden kann.
Gibt es dazu einen Befehl für xBase++ 1.8 ?
Gibt es dazu einen Befehl für xBase++ 1.8 ?
- Jan
- Marvin
- Beiträge: 14655
- Registriert: Fr, 23. Sep 2005 18:23
- Wohnort: 49328 Melle
- Hat sich bedankt: 21 Mal
- Danksagung erhalten: 88 Mal
- Kontaktdaten:
Re: .EXE nur 1x starten
Nein. Aber Du kannst feststellen, ob das Programm schon mal gestartet wurde, und dann einen neuen Start verhindern. Das wurde hier im Forum auch schon mal diskutiert mit verschiedenen Lösungsansätzen, mußt Du mal kurz nach suchen.
Jan
Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
- Martin Altmann
- Foren-Administrator
- Beiträge: 16517
- Registriert: Fr, 23. Sep 2005 4:58
- Wohnort: Berlin
- Hat sich bedankt: 111 Mal
- Danksagung erhalten: 48 Mal
- Kontaktdaten:
Re: .EXE nur 1x starten
Schitte Bön:
http://xbaseforum.de/viewtopic.php?f=23&t=3735
http://xbaseforum.de/viewtopic.php?f=23&t=3735
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/
Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
- Rolf Ramacher
- Der Entwickler von "Deep Thought"
- Beiträge: 1930
- Registriert: Do, 09. Nov 2006 10:33
- Wohnort: Bergheim
- Danksagung erhalten: 3 Mal
- Kontaktdaten:
Re: .EXE nur 1x starten
oder so die Appsys.prg
Code: Alles auswählen
#include "DLL.CH"
#define MUTEX_ALL_ACCESS 2031617
#Define CRLF Chr(13)+Chr(10)
Proc Appsys
LOCAL cMutex:=Upper(AppName())+Chr(0)
LOCAL nH:=DllCall("KERNEL32.DLL", DLL_STDCALL,;
"OpenMutexA", MUTEX_ALL_ACCESS, 0, cMutex)
Set Date to German
Set Deleted On
Set Collation to German
Set Console ON
Set Charset to Ansi
IF nH=0
nH:=DllCall("KERNEL32.DLL",DLL_STDCALL,"CreateMutexA",0,0,cMutex)
ELSE
MsgBox("Das Programm wird bereits ausgeführt!",cMutex)
QUIT
ENDIF
DllCall("KERNEL32.DLL",DLL_STDCALL,"ReleaseMutex",nH)
Return
- Jan
- Marvin
- Beiträge: 14655
- Registriert: Fr, 23. Sep 2005 18:23
- Wohnort: 49328 Melle
- Hat sich bedankt: 21 Mal
- Danksagung erhalten: 88 Mal
- Kontaktdaten:
Re: .EXE nur 1x starten
Ähm, Rolf, Dir ist schon klar was Martin genau 2 Beiträge vor Deinem geschrieben hat?
Jan
Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
- Rolf Ramacher
- Der Entwickler von "Deep Thought"
- Beiträge: 1930
- Registriert: Do, 09. Nov 2006 10:33
- Wohnort: Bergheim
- Danksagung erhalten: 3 Mal
- Kontaktdaten:
Re: .EXE nur 1x starten
Hi Jan
doppelt geschrieben hätl besser. sorry- ich hatte direkt gepostet. Ist ja aber auch nicht schlimm
doppelt geschrieben hätl besser. sorry- ich hatte direkt gepostet. Ist ja aber auch nicht schlimm
- Jan
- Marvin
- Beiträge: 14655
- Registriert: Fr, 23. Sep 2005 18:23
- Wohnort: 49328 Melle
- Hat sich bedankt: 21 Mal
- Danksagung erhalten: 88 Mal
- Kontaktdaten:
Re: .EXE nur 1x starten
... wenn Du man bloß auch woanders so schnell schalten würdest ... Ich habe dort gerade meine letzte Antwort zu diesem Thema geschrieben, mehr wirst Du in dem betreffenden Thread nicht mehr von mir lesen.
Jan
Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
- Tom
- Der Entwickler von "Deep Thought"
- Beiträge: 9367
- Registriert: Do, 22. Sep 2005 23:11
- Wohnort: Berlin
- Hat sich bedankt: 102 Mal
- Danksagung erhalten: 361 Mal
- Kontaktdaten:
Re: .EXE nur 1x starten
Davon abgesehen ist es so, wie Rolf das wiedergegeben hat, falsch, denn hier wird der Mutex gleich wieder freigegeben. Das sollte erst beim Beenden des Programms geschehen, sonst sagt das Ding nie "Programm läuft schon".
Herzlich,
Tom
Tom
- Rolf Ramacher
- Der Entwickler von "Deep Thought"
- Beiträge: 1930
- Registriert: Do, 09. Nov 2006 10:33
- Wohnort: Bergheim
- Danksagung erhalten: 3 Mal
- Kontaktdaten:
Re: .EXE nur 1x starten
Ich weiß nicht mehr von wem ich diesen Hinweis erhalten habe, ich ahbe es so eingebaut und funkt. tadellos
- Herbert
- Der Entwickler von "Deep Thought"
- Beiträge: 1991
- Registriert: Do, 14. Aug 2008 0:22
- Wohnort: Gmunden am Traunsee, Österreich
- Danksagung erhalten: 3 Mal
- Kontaktdaten:
Re: .EXE nur 1x starten
Ich habe die Mutex-Geschichte in der Appsys - und funktioniert.
Grüsse Herbert
Immer in Bewegung...
Immer in Bewegung...
- brandelh
- Foren-Moderator
- Beiträge: 15697
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 66 Mal
- Danksagung erhalten: 33 Mal
- Kontaktdaten:
Re: .EXE nur 1x starten
auf den ersten Blick ... aber wenn so viele behaupten dass es funktioniert ... da musste ich mal in der MSDN nachsehen was da passiertTom hat geschrieben:Davon abgesehen ist es so, wie Rolf das wiedergegeben hat, falsch, denn hier wird der Mutex gleich wieder freigegeben. Das sollte erst beim Beenden des Programms geschehen, sonst sagt das Ding nie "Programm läuft schon".
So wie ich das verstehe, kann man den Mutex mehrfach öffnen und feststellen ob man exclusiven Zugriff bekommt oder nicht.
Diesen exclusiven Zugriff gibt man mit ReleaseMutex wieder frei, der MUTEX handle bleibt aber bestehen bis CloseHandle aufgerufen wird.
Sobald das letzte Programm seinen handle freigibt (z.B. durch Programmende) wird der Mutex in Windows bereinigt.
LOCAL nH:=DllCall("KERNEL32.DLL", DLL_STDCALL, "OpenMutexA", MUTEX_ALL_ACCESS, 0, cMutex)
öffnet den Mutex, falls er schon angelegt wurde und dann ist nH > 0 ... das ist aber genau in diesem Programm nicht erwünscht und die Fehlermeldung folgt.
Nur wenn nH=0 ist, also nicht geöffnet werden konnte - weil er ja nicht existiert - nur dann wird er angelegt und das Programm weiter geführt.
Gruß
Hubert
Hubert
- Rudolf
- Programmier-Gott
- Beiträge: 1418
- Registriert: Mo, 02. Jan 2006 23:03
- Wohnort: Salzburg/Österreich
- Kontaktdaten:
Re: .EXE nur 1x starten
Hallo,
ich mache es anders, mit der Methode sehe ich auch welche User aktiv sind, da ich auch für jeden User ein File beim Start nach dem Login schreibe. Beim Beenden wird das File autom. freigegegen.
Grüße
Rudolf
ich mache es anders, mit der Methode sehe ich auch welche User aktiv sind, da ich auch für jeden User ein File beim Start nach dem Login schreibe. Beim Beenden wird das File autom. freigegegen.
Grüße
Rudolf
Code: Alles auswählen
FUNCTION makeappfile(nMod)
******************************************************************
local cFile := exename() + ".XUF"
static nUsrHnd
DEFAULT nUsrHnd to -1
DEFAULT nMod to 0
if nMod = 1 // close file
if nUsrHnd > 0
FCLOSE(nUsrHnd)
endif
return .t.
endif
if nUsrHnd = -1 // first Login
else
if nUsrHnd > 0
FCLOSE(nUsrHnd)
endif
endif
IF (nUsrHnd := FCREATE( cFile )) == -1 // Exist
dc_msgbox("The system " + exename() + " already started !!!, start cancelled", , , , ,3)
return .f.
endif
FWRITE(nUsrHnd, cFile )
FCLOSE(nUsrHnd)
return .t.
FUNCTION checkrunning(cExe)
******************************************************************
local nUsrHnd
local cFile := cExe + ".exe.XUF"
IF (nUsrHnd := FCREATE( cFile )) == -1 // Exist
return .t.
endif
FCLOSE(nUsrHnd)
filedelete(cFile)
return .f.
Rudolf Reinthaler
http://www.formcommander.net
http://www.formcommander.net
Re: .EXE nur 1x starten
und wenn dir das Programm abstürzt, dann ist der User bis zum wirklichen Beenden als aktiv gespeichert!
- Rudolf
- Programmier-Gott
- Beiträge: 1418
- Registriert: Mo, 02. Jan 2006 23:03
- Wohnort: Salzburg/Österreich
- Kontaktdaten:
Re: .EXE nur 1x starten
Hallo,
aber nur wenn die Fehlermeldung ewig stehenbleibt. Ich habe einen Timeout drin
Grüße
Rudolf
aber nur wenn die Fehlermeldung ewig stehenbleibt. Ich habe einen Timeout drin
Grüße
Rudolf
Rudolf Reinthaler
http://www.formcommander.net
http://www.formcommander.net
Re: .EXE nur 1x starten
Hi,
meine Lösung:
meine Lösung:
Code: Alles auswählen
// Prüfe ob Programm bereits läuft
IF CheckIfAppIsOpen( AppName(), .F. )[2]
// Programm abbrechen, da es bereits läuft
// !!! evtl. laufende Applikation nach vorne holen !!!
QUIT
ENDIF
Code: Alles auswählen
...
********************************************************************************
* Defines
********************************************************************************
#DEFINE PROCESS_QUERY_INFORMATION 1024
#DEFINE PROCESS_VM_READ 16
********************************************************************************
FUNCTION CheckIfAppIsOpen( cAppName, lClose )
* Prüfe ob die Applikation <cAppName> bereits läuft
* Parameter: cAppName: Name der Exe
* Return: .T. für läuft, sonst .F.
********************************************************************************
LOCAL lOpen := .F., ;
aProcesses := space(10240), ;
cbNeeded := 0,;
nPid, ;
nProcHandle, ;
aModules := space(4*10), ;
cbNeeded2 := 0, ;
n, ;
nMax, ;
cname := space(64), ;
nPidDel := NIL, ;
nAnzApp := 0
// xRet
EnumProcesses( @aProcesses, LEN(aProcesses) , @cbNeeded )
// Anzahl laufender Prozesse
nMax := len(trim(aProcesses))/4
FOR n:= 1 TO nMax
nPid := Bin2U(substr(aProcesses,1+((n-1)*4),4))
IF nPidDel==NIL .OR. (nPIdDel==nPid)
nProcHandle := OpenProcess( PROCESS_QUERY_INFORMATION + PROCESS_VM_READ ,0, nPid )
IF EnumProcessModules( nProcHandle, @aModules,len(aModules)/4, @cbNeeded2) != 0
cName := space(128)
// xRet := GetModuleBaseNameA( nProcHandle,bin2u(substr(aModules,1,4)),@cName,len(cName))
GetModuleBaseNameA( nProcHandle,bin2u(substr(aModules,1,4)),@cName,len(cName))
cName := strtran(cname,chr(0),"")
// CloseHandle(nProcHandle)
IF upper(Alltrim(cName))==upper(cAppName)
nAnzApp += 1
nProcHandle := OpenProcess(1,0,nPId)
IF lClose
TerminateProcess(nProcHandle,1)
CloseHandle(nProcHandle)
ENDIF
ENDIF
ENDIF
ENDIF
NEXT n
IF nAnzApp > 1
lOpen := .T.
ENDIF
RETURN { nAnzApp, lOpen }
DLLFUNCTION EnumProcesses(@lpidProcess,cb,@cbNeeded);
USING STDCALL FROM PSAPI.DLL
DLLFUNCTION OpenProcess(dwDesiredAccess,bInheritHandle,dwProcessId);
USING STDCALL FROM KERNEL32.DLL
DLLFUNCTION EnumProcessModules(hProcess,@lphModule,cb,@lpcbNeeded);
USING STDCALL FROM PSAPI.DLL
DLLFUNCTION GetModuleBaseNameA(hProcess,hModule,@lpBaseName,nSize);
USING STDCALL FROM PSAPI.DLL
DLLFUNCTION CloseHandle(nHandle);
USING STDCALL FROM KERNEL32.DLL
DLLFUNCTION TerminateProcess(hProcess,uExitCode) ;
USING STDCALL FROM KERNEL32.DLL
DLLFUNCTION BringWindowToTop( nHwnd ) ;
USING STDCALL FROM USER32.DLL
DLLFUNCTION SetForegroundWindow( nHwnd ) ;
USING STDCALL FROM USER32.DLL
Gruß,
Magic
Magic
- AUGE_OHR
- Marvin
- Beiträge: 12909
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 46 Mal
Re: .EXE nur 1x starten
so was benutze ich auch.Magic hat geschrieben:meine Lösung:
zu beachten, bei Windows 8.1, die evtl. "Gruppierung" bei minimierten MDI Fenstern.
http://www.xbaseforum.de/viewtopic.php?f=23&t=7735
gruss by OHR
Jimmy
Jimmy