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 ?
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() ?
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.
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.
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.
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.
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.
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.
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.
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)
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.
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 veux dire avant, après ou à la place de ReleaseMutex() ? Parce que j'en fais pas, non.
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.
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 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...
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.
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.
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.
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.
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.
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.
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 :
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.
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 :
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.
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 :
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.
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 :
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.
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 :
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 :