Problème avec un appel multiple d'une routine depuis différents EXE
Bonjour,
je vais tâcher d'être suffisemment clair afin d'exposer mon problème en vue de trouver uen solution.
Voilà, j'ai un souci avec l'execution multiple de code depuis des applications (EXE) dffférents sous windows.
1/ une libraire statique (SYSTEM.LIB) contient une routine "message.c" pouvant afficher un message à l'écran selon les conditions d'executions et de résultats antérieurs.
2/ une seconde libriarie statique (ROUTINE.LIB) contient une une routine "appel.c" qui dans son exécution fait appel à la routine "message.c".
3/ l'appel à la routine "message.c". se fait dans un thread de la façon suivante :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13
| // creation du thread
hthread_rcv=CreateThread
(
NULL,
0,
(LPTHREAD_START_ROUTINE)message,
(LPVOID)pointer,
0,
&threadID_rcv
);
// ferme le handle
CloseHandle(hthread_rcv); |
4/ Quatre EXE différents (A.exe, B.exe, C.exe et D.exe), linkés avec ces 2 libraires sont susceptibles de faire afficher ce message, donc d'appeler la routine "appel.c". les 4 EXE tournent en même temps et effectuent périodiquement différents calculs.
5/ une fois les conditions remplies pour faire afficher le message par l'un des 4 EXE, le message est affiché (exemple A.exe va être à l'origine des conditions), un thread est créé dans l'EXE appelant (A.exe), ainsi que des USER objects et des GDI objects.
6/ dans la routine "message.c", je vais vérifier que si le message est affiché, je n'en affiche pas un autre, en utilisant le code suivant :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| LPCSTR Wname="message";
HANDLE hMutex;
// si l'instance existe déjà
hMutex = CreateMutex(NULL, FALSE,Wname);
if ( GetLastError() == ( ERROR_ALREADY_EXISTS || ERROR_ACCESS_DENIED ) )
{
// ferme le handle créé
if (hMutex)
CloseHandle(hMutex);
// on s'en va
return;
} |
7/ maintenat si les conditions d'affichage du message pour une autre EXE sont remplies elles aussi (exemple pour C.exe), un nouveau message est affiché, avec un un thread est créé dans l'EXE appelant (C.exe), ainsi que des USER objects et des GDI objects.
==> le problème se situe là : je pensais que le code du point 6/ allait empêcher ce nouveau message d'être affiché, mais non.
d'où ma question : comment faire pour n'avoir plus qu'un seul message affiché, et avoir la possibilité, pour n'importe quel EXE de faire fermer ce message, qui aurait pu être ouvert pour un autre EXE ?
Merci beaucoup par avance de votre aide,
Thierry