OVH Cloud OVH Cloud

Executer une seule instance d'une appli

9 réponses
Avatar
MrHanky
Simple question, comment executer une seule instance d'un prog ?

MrHanky

9 réponses

Avatar
Mickael Pointier
MrHanky wrote:
Simple question, comment executer une seule instance d'un prog ?

MrHanky



Soit détecter qu'une autre instance est déja lancée, soit créer un mutex
avec un nom donné, et quitter si la création échoue.

Mike
Avatar
Jean-Claude BELLAMY
MrHanky s'est ainsi exprimé:

Simple question, comment executer une seule instance d'un prog ?

MrHanky


La solution la plus sûre, AMHA, est de créer un Mutex, et de tester sa
création.

P.ex., dans certaines de mes applis Delphi, j'ai ce code au début de l'appli
:

const
MonAppli = 'Mon appli que je veux exécuter une seule fois';

....
SetLastError(NO_ERROR);
CreateMutex (nil, False, MonAppli);
if GetLastError=ERROR_ALREADY_EXISTS then
begin
MessageDlg(MonAppli+' est déjà active!', mtWarning,[mbOk], 0);
halt;
end;
...

--
May the Force be with You!
La Connaissance s'accroît quand on la partage
----------------------------------------------------------
Jean-Claude BELLAMY [MVP] - http://www.bellamyjc.org
*
Avatar
MrHanky
Ok ! C'est effectivement simple et ca marche, mais comment faire maintenant
pour avoir un handler de l'appli qui tourne pour lui envoyer un message ? Je
m'explique : l'appli detecte qu'une instance tourne deja et désire lui
envoyer un message, comment faire pour récupérer un CWinApp ou autre avant
de quitter ?

Mr Hanky

"Jean-Claude BELLAMY" a écrit dans le
message de news:bpvo5j$2ua$
MrHanky s'est ainsi exprimé:

> Simple question, comment executer une seule instance d'un prog ?
>
> MrHanky
La solution la plus sûre, AMHA, est de créer un Mutex, et de tester sa
création.

P.ex., dans certaines de mes applis Delphi, j'ai ce code au début de


l'appli
:

const
MonAppli = 'Mon appli que je veux exécuter une seule fois';

....
SetLastError(NO_ERROR);
CreateMutex (nil, False, MonAppli);
if GetLastError=ERROR_ALREADY_EXISTS then
begin
MessageDlg(MonAppli+' est déjà active!', mtWarning,[mbOk], 0);
halt;
end;
...

--
May the Force be with You!
La Connaissance s'accroît quand on la partage
----------------------------------------------------------
Jean-Claude BELLAMY [MVP] - http://www.bellamyjc.org
*




Avatar
Thierry
Bonjour,

MrHanky a écrit :

Ok ! C'est effectivement simple et ca marche, mais comment faire
maintenant pour avoir un handler de l'appli qui tourne pour lui
envoyer un message ? Je m'explique : l'appli detecte qu'une instance
tourne deja et désire lui envoyer un message, comment faire pour
récupérer un CWinApp ou autre avant de quitter ?



SendMessage(::FindWindow("MonAppliWndClass", NULL), ..., ....);

Par exemple.

--
"MOI JE VEUX JOUER DE L'HELICON (PON PON PON PON)"
Avatar
MrHanky
Merci !

"Thierry" a écrit dans le message de
news:
Bonjour,

MrHanky a écrit :

> Ok ! C'est effectivement simple et ca marche, mais comment faire
> maintenant pour avoir un handler de l'appli qui tourne pour lui
> envoyer un message ? Je m'explique : l'appli detecte qu'une instance
> tourne deja et désire lui envoyer un message, comment faire pour
> récupérer un CWinApp ou autre avant de quitter ?

SendMessage(::FindWindow("MonAppliWndClass", NULL), ..., ....);

Par exemple.

--
"MOI JE VEUX JOUER DE L'HELICON (PON PON PON PON)"


Avatar
Aurelien REGAT-BARREL
> SendMessage(::FindWindow("MonAppliWndClass", NULL), ..., ....);

Par exemple.



Est-ce une méthode fiable ?
J'ai en effet lu des mises en garde concernant FindWindow...
http://www.codetools.com/cpp/avoidmultinstance.asp?print=true


--
Aurélien
(Je recherche un stage!)
Avatar
Thierry
Bonjour,

Aurelien REGAT-BARREL a écrit :

Par exemple.



Est-ce une méthode fiable ?
J'ai en effet lu des mises en garde concernant FindWindow...
http://www.codetools.com/cpp/avoidmultinstance.asp?print=true



Ils partent du principe que t'utilises MFC, donc que t'as pas un nom de
classe de fenetre discriminant, et que le titre de la fenetre peut changer.
Si t'as pas ta propre classe de fenetre, pas de probleme.
Au pire il y a la possibilité SendMessage(HWND_BROADCAST,
RegisterWindowMessage("MonMessageDeMonAppliAmoi", 0, 0);
et c'est le handler qui fait le taf.

M'enfin ca reste de la bidouille, faudrait utiliser un vrai mecanisme de
communication inter-process.

--
"MOI JE VEUX JOUER DE L'HELICON (PON PON PON PON)"
Avatar
MrHanky
Manque de chance j'utilise les mfc. Et en lisant l'article que Aurelien a
posté, on se rend compte qu'en résumé Microsoft publie des article pour
éviter que des programmeurs n'utilisent des fonctions microsoft. Je dois
surement etre en train de rever la.
Bon, c'est cool, mais ca résoud pas mon pb general qui est le suivant.
- Tester si une appli tourne déja (pourquoi pas avec CreateMutex comme
proposé dans un post précédent)
- Si une appli tourne deja, lui envoyer le message suivant :
"MonMessageAMoi"

Voila

MrHanky

"Thierry" a écrit dans le message de
news:
Bonjour,

Aurelien REGAT-BARREL a écrit :

>> Par exemple.
>
> Est-ce une méthode fiable ?
> J'ai en effet lu des mises en garde concernant FindWindow...
> http://www.codetools.com/cpp/avoidmultinstance.asp?print=true

Ils partent du principe que t'utilises MFC, donc que t'as pas un nom de
classe de fenetre discriminant, et que le titre de la fenetre peut


changer.
Si t'as pas ta propre classe de fenetre, pas de probleme.
Au pire il y a la possibilité SendMessage(HWND_BROADCAST,
RegisterWindowMessage("MonMessageDeMonAppliAmoi", 0, 0);
et c'est le handler qui fait le taf.

M'enfin ca reste de la bidouille, faudrait utiliser un vrai mecanisme de
communication inter-process.

--
"MOI JE VEUX JOUER DE L'HELICON (PON PON PON PON)"


Avatar
Aurelien REGAT-BARREL
Thierry wrote:

Ils partent du principe que t'utilises MFC, donc que t'as pas un nom de
classe de fenetre discriminant, et que le titre de la fenetre peut
changer. Si t'as pas ta propre classe de fenetre, pas de probleme.



Tu voulais sûrement dire "Si tu as ta propre classe", sinon j'ai pas
compris.

Au pire il y a la possibilité SendMessage(HWND_BROADCAST,
RegisterWindowMessage("MonMessageDeMonAppliAmoi", 0, 0);
et c'est le handler qui fait le taf.



Comme pour CreateMutex, il ya toujours la probabilité, certes très faible,
que le nom utilisé le soit par aussi une autre appli. Faut donc veiller à
prendre un nom à rallonge.
Le même auteur de l'article donné traite du cas de WM_COPYDATA et de
l'utilisation d'un GUID.
http://www.flounder.com/wm_copydata.htm

M'enfin ca reste de la bidouille, faudrait utiliser un vrai mecanisme de
communication inter-process.



Quelques pistes :
http://www.codeproject.com/threads/#Inter%2DProcess+Communication

Tu peux aussi rapidement regarder comment des softs genre WinAmp ou Context
procèdent pour que quand une 2° instance est lancée avec un fichier en
paramètre, elle signale à celle qui tourne de traîter ledit fichier et se
termine...
Bon courage.
--
Aurélien
(Je recherche un stage!)