à propos des mutex
Le
Frd

Bonjour,
une petite question :)
J'ai une appli dont je ne veux qu'une seule instance et pour cela
j'utilise un mutex
au lancement
HANDLE m_MonMutex = CreateMutex(NULL, FALSE, "MonNomDeMutex");
Je peux donc voir si l'appli est déjà lancée selon le résultat de
GetLastError() et quitter
en sortie
ReleaseMutex(m_MonMutex);
Normalement tout se passe bien, sauf sur un vieil ordi en Win98, où le
ReleaseMutex ne semble pas se faire.
Du coup impossible de lancer l'appli 2 fois de suite, il faut redémarrer.
J'ai essayé avec un petit programme qui tente le ReleaseMutex si il le
trouve, mais ça marche pas parce que je ne suis pas propriétaire du
mutex en question
Y a-t-il une solution pour virer un mutex qu'on a pas créé soi-même ?
Ça se cache où ces bestioles ?
Merci d'avance
Fred
une petite question :)
J'ai une appli dont je ne veux qu'une seule instance et pour cela
j'utilise un mutex
au lancement
HANDLE m_MonMutex = CreateMutex(NULL, FALSE, "MonNomDeMutex");
Je peux donc voir si l'appli est déjà lancée selon le résultat de
GetLastError() et quitter
en sortie
ReleaseMutex(m_MonMutex);
Normalement tout se passe bien, sauf sur un vieil ordi en Win98, où le
ReleaseMutex ne semble pas se faire.
Du coup impossible de lancer l'appli 2 fois de suite, il faut redémarrer.
J'ai essayé avec un petit programme qui tente le ReleaseMutex si il le
trouve, mais ça marche pas parce que je ne suis pas propriétaire du
mutex en question
Y a-t-il une solution pour virer un mutex qu'on a pas créé soi-même ?
Ça se cache où ces bestioles ?
Merci d'avance
Fred
Pas normal, ça doit marcher.
Quelle est l'erreur donnée par GetLastError() ?
Bonjour
Il y a peut-être plus simple, par exemple en utilisant FindWindow() et
en quittant si l'application a été trouvée. L'avantage est aussi qu'on
peut même lui envoyer un message par WM_COPYDATA, par exemple un nom de
fichier à ouvrir qui a été passé en argument.
L'erreur au ReleaseMutex est ERROR_NOT_OWNER comme si j'étais pas le
propriétaire du Mutex créé au début, alors que son Handle reste le même.
Ce qui est étrange c'est que cette erreur se produit aussi sur XP et
vraisemblablement sur les suivants, mais par contre une relance du
programme avec à nouveau CreateMutex ne donne ERROR_ALREADY_EXISTS
(normal puisque le Release a foiré) que sous Win98.
Tu fais bien un CloseHandle() ?
(http://support.microsoft.com/kb/243953)
Bonjour
tu veux dire avant, après ou à la place de ReleaseMutex() ?
Parce que j'en fais pas, non.
Juste comme dans l'exemple de MS, qui a toujours marché en principe...
A la place.
La fonction ReleaseMutex() ne fait pas ce que tu sembles croire. En
fait, elle permet de libérer un mutex dans le sens où il n'appartient
plus au programme qui l'a créé après un appel réussi à cette fonction.
Ca permet à d'autres programmes d'acquérir le mutex avec une fonction de
synchronisation. (Par exemple : WaitForSingleObject())
Ce que tu veux faire c'est fermer le manipulateur du mutex avec la
fonction CloseHandle() comme l'a précisé Christian dans un message
précédent avec la KB qui va bien.
Par ailleurs, je te conseil de lire intégralement la documentation de
chaque fonction de l'API Windows que tu veux utiliser, en particulier la
rubrique 'Remarks' qui explique comment l'utiliser correctement.
Par exemple, dans l'article de la fonction CreateMutex() la dernière
ligne de remarque (juste avant 'Requirements') précise bien qu'il faut
utiliser la fonction CloseHandle() sur le handle du mutex pour le fermer.
http://msdn.microsoft.com/en-us/library/ms682411
Bonjour,
Ok. Ce qui est curieux c'est que la fonction ReleaseMutex() me dise que
je ne suis pas propriétaire du mutex en question.
Il est dit juste après que le handle est fermé automatiquement à la fin
du process, et que le mutex est détruit quand son dernier handle est
fermé. Cet automatisme ne se fait peut-être pas sur 98, ce qui
expliquerait mon problème de départ.
Merci à tous.
La fonction en question est peut être disponible sous Windows 98 pour la
compatibilité avec Windows XP mais sans effet concret comme il n'y a pas
vraiment de notion d'utilisateur et donc de propriétaire sur cet OS ...
d'où l'erreur systématique.
En tout cas, c'est ce que laisse penser la documentation officielle au
sujet de cette fonction :
http://msdn.microsoft.com/fr-fr/library/ms685066%28v=VS.85%29
Rubrique 'Requirements' : Minimum supported client : Windows XP.
Oui, c'est vrai uniquement sur l'OS minimal indiqué; autrement dit,
Windows XP / Server 2003 et certainement pas avec Windows 95/98/ME.
D'où l'obligation d'un appel explicite à CloseHandle() juste avant la
fin du programme.
Tout à fait, mais j'ai aussi cette erreur (ERROR_NOT_OWNER) lors du
ReleaseMutex() sur XP.
Je vais tester avec CloseHandle() dès que possible.