Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

à propos des mutex

12 réponses
Avatar
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

10 réponses

1 2
Avatar
Jerome
Frd a écrit :

Normalement tout se passe bien, sauf sur un vieil ordi en Win98, où le
ReleaseMutex ne semble pas se faire.




Pas normal, ça doit marcher.
Quelle est l'erreur donnée par GetLastError() ?
Avatar
Bertrand Lenoir-Welter
J'ai une appli dont je ne veux qu'une seule instance et pour cela
j'utilise un mutex



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.
Avatar
Frd
Le 04/05/2012 15:56, Jerome a écrit :
Frd a écrit :

Normalement tout se passe bien, sauf sur un vieil ordi en Win98, où le
ReleaseMutex ne semble pas se faire.




Pas normal, ça doit marcher.
Quelle est l'erreur donnée par GetLastError() ?



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.
Avatar
Christian ASTOR
Frd a écrit :
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.



Tu fais bien un CloseHandle() ?
(http://support.microsoft.com/kb/243953)
Avatar
Frd
Le 04/05/2012 17:35, Christian ASTOR a écrit :
Frd a écrit :
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.



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.
Avatar
Christian ASTOR
Frd a écrit :
Le 04/05/2012 17:35, Christian ASTOR a écrit :

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...
Avatar
Bertrand Usse
Frd wrote:

[...]

tu veux dire avant, après ou à la place de ReleaseMutex() ?
Parce que j'en fais pas, non.



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
Avatar
Frd
Le 07/05/2012 18:49, Bertrand Usse a écrit :

Bonjour,

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())



Ok. Ce qui est curieux c'est que la fonction ReleaseMutex() me dise que
je ne suis pas propriétaire du mutex en question.

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.



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.
Avatar
Bertrand Usse
Frd wrote:

Ok. Ce qui est curieux c'est que la fonction ReleaseMutex() me dise que
je ne suis pas propriétaire du mutex en question.



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.

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.



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.

Merci à tous.
Avatar
Frd
Le 10/05/2012 12:25, Bertrand Usse a écrit :
Ok. Ce qui est curieux c'est que la fonction ReleaseMutex() me dise que
je ne suis pas propriétaire du mutex en question.



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.



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.
1 2