OVH Cloud OVH Cloud

charger un fichier si on clique dessus sur linstance deja ouverte

7 réponses
Avatar
dark poulpo
bonjour,

compilateur: vc++
methode: MFC

voila, jai une extension qui est attribué a mon appli.
mon appli a une seul instance.

je voudrais savoir comment l'instance deja lancé peut charger un fichier sur
lequel on a cliqué dessus (dans explorer).

merci d'avance

7 réponses

Avatar
Patrick Philippot
dark poulpo wrote:
voila, jai une extension qui est attribué a mon appli.
mon appli a une seul instance.

je voudrais savoir comment l'instance deja lancé peut charger un
fichier sur lequel on a cliqué dessus (dans explorer).



Bonjour,

Nous allons supposer que vous avez déjà traité le problème de
l'instance unique de votre application (par exemple, par utilisation
d'un mutex). Quand vous double-cliquez dans Explorer un fichier ayant
l'extension associée à votre appli, ce dernier va essayer de charger une
deuxième instance en passant le nom du fichier sur la ligne de commande.
Dans la section de code de votre appli qui détecte la présence d'une
première instance, il vous suffit de récupérer le nom du fichier passé
sur la ligne de commande puis d'envoyer cette chaîne de caractères à la
première instance avant de fermer le programme.

Pour ce faire, vous pouvez utiliser n'importe quel mécanisme d'IPC pour
communiquer entre les 2 instances mais dans ce cas, le plus simple est
d'implémenter un message privé (WM_USER + n) que vous enverrez à la
fenêtre ou au thread principal de la première instance en passant par
exemple le pointeur vers la chaîne dans lParam. Sur réception de ce
message, l'instance existance déclenchera le traitement de chargement du
fichier dont elle vient de recevoir le nom.

C'est une technique, il y en a d'autres. Voir cet excellent article qui
traite à la fois de l'instance unique et du passage de la ligne de
commande à l'instance existante:

http://www.codeproject.com/library/PlgInArchSingInst.asp

--
Patrick Philippot - Microsoft MVP
MainSoft Consulting Services
www.mainsoft.fr
Avatar
Thierry
Bonjour,

Patrick Philippot a écrit :

Pour ce faire, vous pouvez utiliser n'importe quel mécanisme d'IPC pour
communiquer entre les 2 instances mais dans ce cas, le plus simple est
d'implémenter un message privé (WM_USER + n) que vous enverrez à la
fenêtre ou au thread principal de la première instance en passant par
exemple le pointeur vers la chaîne dans lParam.



Heu... T'es sur de ça ? Le pointeur sera valable uniquement pour le nouveau
process.
WM_COPYDATA est simple a utiliser.

Sur réception de ce
message, l'instance existance déclenchera le traitement de chargement du
fichier dont elle vient de recevoir le nom.



J'avais eu un probleme dans le cas où le traitement utilise un objet COM
(erreur 0x8001010D), apparement COM utilise aussi les messages.
Sut reception du message il faut copier la ligne de commande puis se POSTER
un message pour differer le traitement.

--
« Always look at the bright side of the life... »
Avatar
dark poulpo
----- Original Message -----
From: "Thierry"
Newsgroups: fr.comp.os.ms-windows.programmation
Sent: Tuesday, December 07, 2004 11:52 AM
Subject: Re: charger un fichier si on clique dessus sur linstance deja
ouverte


Bonjour,

Patrick Philippot a écrit :

> Pour ce faire, vous pouvez utiliser n'importe quel mécanisme d'IPC pour
> communiquer entre les 2 instances mais dans ce cas, le plus simple est
> d'implémenter un message privé (WM_USER + n) que vous enverrez à la
> fenêtre ou au thread principal de la première instance en passant par
> exemple le pointeur vers la chaîne dans lParam.

Heu... T'es sur de ça ? Le pointeur sera valable uniquement pour le


nouveau
process.
WM_COPYDATA est simple a utiliser.



merci a vous, finalement, c'est copydata que jai utilisé.
jai essayer le dde mais pas moyen de savoir comment faire le coté serveur
sur un modal.
Avatar
Aurélien REGAT-BARREL
> > WM_COPYDATA est simple a utiliser.

merci a vous, finalement, c'est copydata que jai utilisé.



Attention avec ce genre de message car certaines applis codées un peu
n'importe comment envoient leur WM_COPYDATA via un HWND_BROADCAST et tu peux
te retrouver à recevoir des messages envoyés par un autre. Donc faire un
minimum de vérifications sur ce que tu reçois, pour pas planter bêtement...

--
Aurélien REGAT-BARREL
Avatar
Patrick Philippot
Thierry wrote:
en passant par exemple le pointeur vers la chaîne dans lParam.



Heu... T'es sur de ça ? Le pointeur sera valable uniquement pour le
nouveau process.
WM_COPYDATA est simple a utiliser.



Oui, désolé, il faut passer par WM_COPYDATA dans ce cas ou peut-être
passer un Atom?

--
Patrick Philippot - Microsoft MVP
MainSoft Consulting Services
www.mainsoft.fr
Avatar
Thierry
Bonjour,

Patrick Philippot a écrit :

Thierry wrote:
en passant par exemple le pointeur vers la chaîne dans lParam.



Heu... T'es sur de ça ? Le pointeur sera valable uniquement pour le
nouveau process.
WM_COPYDATA est simple a utiliser.



Oui, désolé, il faut passer par WM_COPYDATA dans ce cas ou peut-être
passer un Atom?



A propos : comment se fait-il que certains messages (systemes) puissent
passer des pointeurs ?? (WM_SETTINGCHANGE)

--
« Always look at the bright side of the life... »
Avatar
Patrick Philippot
Thierry wrote:
A propos : comment se fait-il que certains messages (systemes)
puissent passer des pointeurs ?? (WM_SETTINGCHANGE)



Ce cas est différent: lParam pointe vers un bloc alloué par le système
et mappé dans votre espace adresse. Pas de souci. Il ne s'agit pas d'un
échange interprocess.

C'est d'ailleurs ce que fait WM_COPYDATA: les données sont copiées dans
un autre bloc mappé dans l'espace adrese du destinataire. C'est
d'ailleurs pour cela que l'on ne peut utiliser ces données qu'en
lecture. Les modifier ne servirait à rien car les modifs ne seraient pas
vues par l'envoyeur. Il faut dans ce cas utiliser un WM_COPYDATA dans
l'autre sens.

--
Patrick Philippot - Microsoft MVP
MainSoft Consulting Services
www.mainsoft.fr