ATOUTFOX
COMMUNAUTÉ FRANCOPHONE DES PROFESSIONNELS FOXPRO
Visual FoxPro : le développement durable

Limiter une application à une instance (sans utiliser le titre de l'application)   



L'auteur

Mike Gagnon
Canada Canada
Membre Simple
# 0000000025
enregistré le 14/10/2004

Gagnon Mike
Pointe Cla H9R 3K8
de la société Carver Technologies Inc.
Fiche personnelle


Note des membres
pas de note

Contributions > 05 - API et appels systèmes

Limiter une application à une instance (sans utiliser le titre de l'application)
# 0000000089
ajouté le 24/11/2004 16:25:05 et modifié le 03/05/2006
consulté 7505 fois
Niveau initié

Version(s) Foxpro :
VFP 7.0

Description
Version #1

Voici comment limiter une application à une instance sans se baser sur le titre de l'application. (Fonctionne aussi sur Windows XP)

Un fois que l'application quitte normalement, n'oubliez pas d'utiliser

 = GlobalDeleteAtom(tcAtom)

Version #2

Fait usage d'un sémaphore (une varialble globale au niveau de Windows).  Dans les premières lignes du main, on vérifie l'existence de la variable semaphore et si elle n'existe pas, on la crée, si elle existe déjà on ne peut le récréer et la fonction génère un erreur que l'on récupère. Pour faire le test de cette fonction, roulez la fonction deux fois de suite, et la deuxième fois le messagebox apparait pour indiquer que la variable sémaphore existe déjà (ou que l'application roule déjà dans un autre instance dans ce cas ci). À noter que le nom de la variable sémaphore n'est pas important.

Code source :
&& Version #1

#Define AtomStrLength   512
Local lcAtomName
lcAtomName = "mon application"
Declare Integer GlobalAddAtom In win32api String
Declare Integer GlobalDeleteAtom In win32api Integer
Declare Integer GlobalGetAtomName In kernel32;
     INTEGER  nAtom,;
     STRING @ lpBuffer,;
     INTEGER  nSize
findAtom(lcAtomName)
Function findAtom(tcAtom)
Create Cursor cs (atom N(12), strlen N(5), Name C(100))
Index On Allt(NameTag Name
For nAtom = 49152 To 65535
     lpBuffer = Repli(Chr(0), AtomStrLength)
     lnResult = GlobalGetAtomName (nAtom, @lpBuffer, AtomStrLength)

     If lnResult > 0
          Insert Into cs Values (nAtom, lnResult, Left(lpBuffer, lnResult))
     Endif
Endfor
Select cs
If Seek(tcAtom)
     Messagebox("Application is already running")
     Quit
Else
     = GlobalAddAtom(tcAtom)
Endif

&& Version #2

private lcVar
lcVar = .f.
lcVar=IsAppRunning('monapplication')
IF lcVar
  MESSAGEBOX("L'application roule déjà!")
endif
Function IsAppRunning
Lparameters tcSemaphoreName
Local hsem, lpszSemName
#Define ERROR_ALREADY_EXISTS 183
Declare Integer GetLastError In win32API
Declare Integer CreateSemaphore In WIN32API ;
  string @ lpSemaphoreAttributes, ;
  LONG lInitialCount, ;
  LONG lMaximumCount, ;
  string @ lpName
hsem = CreateSemaphore(0,0,1,tcSemaphoreName)
Return (hsem # 0 And GetLastError() == ERROR_ALREADY_EXISTS)

Commentaires
le 13/11/2007, Olivier Hamou a écrit :
Bonjour Mike,
Quelle est la meilleur version pour que cela marche avec win2000, winxp et 2003
et voir win98,
la version avec semaphore marche sur tous ces systemes ?

Amicalement Olivier

le 13/11/2007, Mike Gagnon a écrit :
Honnetement, ni un ni l'autre. Ces deux fonctions assument que ton application ne crash jamais. C'est beau comme code, mais pas realiste. si j'etais toi je regardrais du cote de APPMUTEXT()

www.atoutfox.org - Site de la Communauté Francophone des Professionnels FoxPro - v3.4.0 - © 2004-2024.
Cette page est générée par un composant COM+ développé en Visual FoxPro 9.0-SP2-HF3