Mike Gagnon 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" DeclareInteger GlobalAddAtom In win32api String DeclareInteger GlobalDeleteAtom In win32api Integer DeclareInteger GlobalGetAtomName In kernel32; INTEGER nAtom,; STRING @ lpBuffer,; INTEGER nSize
findAtom(lcAtomName) Function findAtom(tcAtom) CreateCursor cs (atom N(12), strlen N(5), Name C(100)) IndexOn Allt(Name) TagName For nAtom = 49152 To 65535
lpBuffer = Repli(Chr(0), AtomStrLength)
lnResult = GlobalGetAtomName (nAtom, @lpBuffer, AtomStrLength)
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 DeclareInteger GetLastError In win32API DeclareInteger 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()
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