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
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 *
MrHanky <hanky@uranus.org> 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
Jean-Claude.Bellamy@wanadoo.fr * JC.Bellamy@free.fr
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 *
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 *
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" <Jean-Claude.Bellamy@wanadoo.fr> a écrit dans le
message de news:bpvo5j$2ua$1@news-reader4.wanadoo.fr...
MrHanky <hanky@uranus.org> 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
Jean-Claude.Bellamy@wanadoo.fr * JC.Bellamy@free.fr
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 *
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 ?
-- "MOI JE VEUX JOUER DE L'HELICON (PON PON PON PON)"
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 ?
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 ?
-- "MOI JE VEUX JOUER DE L'HELICON (PON PON PON PON)"
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 ?
-- "MOI JE VEUX JOUER DE L'HELICON (PON PON PON PON)"
Merci !
"Thierry" <yarglah@com.invalid> a écrit dans le message de
news:XnF943EBBCE68FA8pouletetcetc@213.228.0.138...
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 ?
> 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 ?
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!)
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)"
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)"
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)"
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)"
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" <yarglah@com.invalid> a écrit dans le message de
news:XnF94409CB195240pouletetcetc@213.228.0.138...
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)"
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)"
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!)
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!)
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!)