Admin Fondateur
Nombre de messages : 197 Age : 40 Localisation : Tlemcen ( Algérie ) Date d'inscription : 04/12/2006
| Sujet: Comment n'instancier qu'une seule fois un programme ? Ven 12 Jan - 5:57 | |
| Il existe de nombreuses méthodes pour n'autoriser qu'une seule instance d'un même programme. La plus élégante étant sans aucun doute l'utilisation des Mutex. Les Mutex sont en fait des variables globales qui génèrent un message d'erreur lorsque l'on tente de les instancier alors que cela a déjà été fait. Pour interdire de lancer 2 fois une même application, il suffit donc de tester si une erreur est produite lors de la création d'un Mutex pour notre application. Cela se fait dès le lancement de l'application, c'est à dire dans le code de base du projet accessible par le menu Projet|Voir la source. - Code:
-
program Project1;
uses Forms, Unit1 in 'Unit1.pas' {Form1};
{$R *.RES}
begin Application.Initialize; Application.CreateForm(TForm1, Form1); Application.Run; end. Toutes les fonctions relatives aux Mutex se trouvant dans l'unité Windows, il est donc nécessaire de l'ajouter dans la clause uses. Afin d'être totalement sûr qu'une autre erreur ne vienne perturber le lancement de notre programme, il est préférable d'effacer toute trace de la dernière erreur survenue dans le système. On utilise pour cela la commande SetLastError(NO_ERROR). Il est à présent temps de créer le Mutex pour l'application. On utilise pour ce faire la commande CreateMutex(lpMutexAttributes: PSecurityAttributes, bInitialOwner: LongBool, lpName: PChar): Cardinal où les paramètres correspondent respectivement aux attributs de sécurité du Mutex, au thread qui en est le propriétaire et au nom du Mutex. Si le Mutex existe déjà, l'erreur ERROR_ALREADY_EXISTS sera alors déclenchée. Il faut donc tester la dernière erreur intervenue dans le système et lancer ou non une instance de l'application.
- Code:
-
program Project1;
uses Windows, Forms, Unit1 in 'Unit1.pas' {Form1};
{$R *.RES} var H : HANDLE; begin SetLastError(NO_ERROR); H := CreateMutex (nil, False, 'Nom de l application'); if GetLastError = ERROR_ALREADY_EXISTS then Exit; Application.Initialize; Application.CreateForm(TForm1, Form1); Application.Run; CloseHandle(H); end. | |
|