|
|
|||||
|
Le langage Visual Basic possède un objet App représentant l'application. L'une de ses propriété permet de déterminer si une autre instance de l'application est déjà en cours d'exécution. Cette propriété est App.PrevInstance. Malheureusement, l'objet App fourni par eVB ne possède pas cette propriété. Il faut trouver un autre moyen. Vous remarquerez que si vous lancer un programme eVB 2 fois, le runtime eVB effectue automatiquement l'opération d'arrêt de la nouvelle instance avec passage en avant plan de la première. Ca marche seulement si vous lancer les 2 instances du même endroit. Si vous lancer une application depuis un raccourci, puis de nouveau la même application depuis son fichier .vb directement, ça ne marche plus, vous vous retrouvez avec 2 instances différentes, et là il faut faire quelque chose. L'autre moyen s'appelle un mutex. Un mutex est un objet géré par le système d'exploitation qui permet de synchroniser les applications. Si par exemple, une seule application peut accéder à un instant à un periphérique, elle pose un mutex. Si une autre application veut accéder aussi à ce périphérique, elle pose aussi un mutex, le même. Comme la première application l'a déjà fait, la seconde échoue, et en déduit que le périphérique concerné n'est pas disponible, et recommence plus tard. Lorsque la première application en a terminé avec le périphériques, elle libère le mutex, ce qui permet à la seconde de le poser à son tour, et ainsi d'accéder au périphérique. L'accès à ce périphérique est synchronisé à l'aide d'un mutex. Puisque nous voulons que notre programme ne se lance pas plus d'une fois, il suffit de poser un mutex au démarrage. Si l'application réussit, elle peut s'exécuter, elle est seule. Si elle échoue, c'est qu'une autre instance tourne déjà, et elle doit quitter immédiatement. Il n'est pas nécessaire de libérer explicitement le mutex, car le fait d'arrêter une application par l'instruction App.End libère tous les mutex créés par celle-ci. Nous allons donc utiliser la fonction CreateMutex, qui se trouve dans la librairie dynamique Coredll.dll, et que l'on déclare comme ceci : Public Declare Function CreateMutex Lib "Coredll" Alias "CreateMutexW" (ByRef lpMutexAttributes as long, Byval bInitiaOwner as long, Byval lpName as string) as long Nous avons aussi besoin d'une autre fonction qui retourne le code de la dernière erreur qui s'est déclenchée. Cette fonction est GetLastError : Public Declare Function GetLastError Lib "Coredll" () as Long Si la fonction CreateMutex ne peut créer le mutex car une autre application l'a déjà fait, la fonction GetLastError retourne la valeur 183 qui correspond à la constante ERROR_ALREADY_EXISTS. Const ERROR_ALREADY_EXISTS = 183 Dernière chose, il vous faut choisir pour votre application une chaine de caractère qui deviendra le nom du mutex. Cette chaine doit être bien choisie et ne pas être source de blocage pour d'autres applications. Un bon moyen est de choisir le titre de l'application qui est retourné par App.Title, ce qui va nous obliger à remplir cette information dans les propriétés du projet, une bonne habitude quoi. Le code de vérification au démarrage peut ressembler à ça : Call CreateMutex(CLng(0),
1, App.Title) Il est impératif de bien passer Clng(0) comme premier paramètres. En effet la fonction CreateMutex est définie pour recevoir la valeur NULL (pointeur NULL en C) comme premier paramètre. Avec eVB, si vous voulez passer cette valeur, il faut utiliser CLng(0) Voilà, maintenant votre programme ne peut plus jamais avoir plus d'une seule instance en cours d'exécution à la fois.
|
|||||
|
|
|||||
|
Copyright 2001-2004 - Tous droits réservés
|
|||||
|
iPAQ
est un produit de COMPAQ.
|