.EXE nur 1x starten

Eigentlich ist mir die Frage peinlich, aber es kann sonst niemand helfen ... :)

Moderator: Moderatoren

Antworten
BIK
UDF-Programmierer
UDF-Programmierer
Beiträge: 68
Registriert: Di, 23. Aug 2011 14:34
Hat sich bedankt: 1 Mal

.EXE nur 1x starten

Beitrag von BIK »

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 ?
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: .EXE nur 1x starten

Beitrag von Jan »

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
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16502
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: .EXE nur 1x starten

Beitrag von Martin Altmann »

:grommit:
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.
BIK
UDF-Programmierer
UDF-Programmierer
Beiträge: 68
Registriert: Di, 23. Aug 2011 14:34
Hat sich bedankt: 1 Mal

Re: .EXE nur 1x starten

Beitrag von BIK »

herzlichen Dank!
Benutzeravatar
Rolf Ramacher
Der Entwickler von "Deep Thought"
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

Beitrag von Rolf Ramacher »

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
Gruß Rolf

Mitglied der Gruppe XUG-Cologne
www.xug-cologne.de
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: .EXE nur 1x starten

Beitrag von Jan »

Ähm, Rolf, Dir ist schon klar was Martin genau 2 Beiträge vor Deinem geschrieben hat?

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Rolf Ramacher
Der Entwickler von "Deep Thought"
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

Beitrag von Rolf Ramacher »

Hi Jan

doppelt geschrieben hätl besser. sorry- ich hatte direkt gepostet. Ist ja aber auch nicht schlimm
Gruß Rolf

Mitglied der Gruppe XUG-Cologne
www.xug-cologne.de
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: .EXE nur 1x starten

Beitrag von Jan »

... 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
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: .EXE nur 1x starten

Beitrag von Tom »

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". :wink:
Herzlich,
Tom
Benutzeravatar
Rolf Ramacher
Der Entwickler von "Deep Thought"
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

Beitrag von Rolf Ramacher »

Ich weiß nicht mehr von wem ich diesen Hinweis erhalten habe, ich ahbe es so eingebaut und funkt. tadellos
Gruß Rolf

Mitglied der Gruppe XUG-Cologne
www.xug-cologne.de
Benutzeravatar
Herbert
Der Entwickler von "Deep Thought"
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

Beitrag von Herbert »

Ich habe die Mutex-Geschichte in der Appsys - und funktioniert.
Grüsse Herbert
Immer in Bewegung...
BIK
UDF-Programmierer
UDF-Programmierer
Beiträge: 68
Registriert: Di, 23. Aug 2011 14:34
Hat sich bedankt: 1 Mal

Re: .EXE nur 1x starten

Beitrag von BIK »

ich hab mutex auch in der appsys und es funktioniert herrlich! :blob8:
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: .EXE nur 1x starten

Beitrag von brandelh »

Tom 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". :wink:
auf den ersten Blick ... aber wenn so viele behaupten dass es funktioniert ... da musste ich mal in der MSDN nachsehen was da passiert ;-)

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
Benutzeravatar
Rudolf
Programmier-Gott
Programmier-Gott
Beiträge: 1418
Registriert: Mo, 02. Jan 2006 23:03
Wohnort: Salzburg/Österreich
Kontaktdaten:

Re: .EXE nur 1x starten

Beitrag von Rudolf »

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

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.
BIK
UDF-Programmierer
UDF-Programmierer
Beiträge: 68
Registriert: Di, 23. Aug 2011 14:34
Hat sich bedankt: 1 Mal

Re: .EXE nur 1x starten

Beitrag von BIK »

und wenn dir das Programm abstürzt, dann ist der User bis zum wirklichen Beenden als aktiv gespeichert!
Benutzeravatar
Rudolf
Programmier-Gott
Programmier-Gott
Beiträge: 1418
Registriert: Mo, 02. Jan 2006 23:03
Wohnort: Salzburg/Österreich
Kontaktdaten:

Re: .EXE nur 1x starten

Beitrag von Rudolf »

Hallo,
aber nur wenn die Fehlermeldung ewig stehenbleibt. Ich habe einen Timeout drin
Grüße
Rudolf
Benutzeravatar
Magic
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 343
Registriert: Mo, 11. Jul 2011 12:01

Re: .EXE nur 1x starten

Beitrag von Magic »

Hi,

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
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: .EXE nur 1x starten

Beitrag von AUGE_OHR »

Magic hat geschrieben:meine Lösung:
so was benutze ich auch.

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
Antworten