OVH Cloud OVH Cloud

envoyer des messages utilisateurs entre appli

6 réponses
Avatar
toms
bonjour a tous!
j'ai deux applications differentes qui tournent en meme temps.
Je veux envoyer un message de l'ne vers l'autre, mais un message
personnalise (WM_USER + XXX)
Or SendMessage et PostMessage ne l'autorisent pas.
Quelqu'un aurait-il une solution a me proposer?
Merci!
toms

6 réponses

Avatar
Manuel Leclerc
toms a écrit :

j'ai deux applications differentes qui tournent
en meme temps. Je veux envoyer un message de l'une
vers l'autre, mais un message personnalise
(WM_USER + XXX)
Or SendMessage et PostMessage ne l'autorisent pas.



Pourquoi écris-tu que "ne l'autorisent pas." ?
Avatar
toms
> Pourquoi écris-tu que "ne l'autorisent pas." ?



ben parce que ce n'est pas autorise par l'API :
"The system only does marshalling for system messages (those in the range 0
to WM_USER). To send other messages (those above WM_USER) to another
process, you must do custom marshalling."

Et moi je ne sais pas ce que c'est, le marshalling ;)
Avatar
Manuel Leclerc
toms a écrit :

> Pourquoi écris-tu que "ne l'autorisent pas." ?

ben parce que ce n'est pas autorise par l'API :
"The system only does marshalling for system
messages (those in the range 0 to WM_USER). To
send other messages (those above WM_USER) to
another process, you must do custom marshalling."

Et moi je ne sais pas ce que c'est, le marshalling ;)



Je pense qu'ils parlent là du contenu de wParam et
lParam. S'il y a des pointeurs vers de la mémoire
du process qui envoie, quand le process qui reçoit
essaye d'utiliser ces pointeurs, ça fait boum.

Le marshalling consiste ici à ce que les pointeurs
qui sont présentés au process receveur pointent bien
dans son espace d'adressage. Ca suppose que le code
qui fait le marshalling connaissent la sémantique des
messages, car il doit faire des copies de données d'un
espace d'adressage à l'autre, et pour copier, il faut
savoir quoi et dans quel sens, surtout quand c'est
SendMessage. Pense à WM_GETTEXT/WM_SETTEXT par exemple.

Si tu n'envoies pas de pointeur, pas de problèmes.

Si tu veux envoyer des pointeurs, donc des données, tu
peux utiliser WM_COPYDATA, qui est fait pour ça.
Avatar
toms
> Je pense qu'ils parlent là du contenu de wParam et
lParam. S'il y a des pointeurs vers de la mémoire
du process qui envoie, quand le process qui reçoit
essaye d'utiliser ces pointeurs, ça fait boum.

Le marshalling consiste ici à ce que les pointeurs
qui sont présentés au process receveur pointent bien
dans son espace d'adressage. Ca suppose que le code
qui fait le marshalling connaissent la sémantique des
messages, car il doit faire des copies de données d'un
espace d'adressage à l'autre, et pour copier, il faut
savoir quoi et dans quel sens, surtout quand c'est
SendMessage. Pense à WM_GETTEXT/WM_SETTEXT par exemple.

Si tu n'envoies pas de pointeur, pas de problèmes.

Si tu veux envoyer des pointeurs, donc des données, tu
peux utiliser WM_COPYDATA, qui est fait pour ça.




merci je vais essayer.
Mais si j'ai bien compris, j'aurais a moins du recevoir le message, meme si
apres j'aurais recupere n'importe quoi... Or le message n'est jamais recu
... Ou alors, c'est que tout simplement les messages USER ne sont pas
autorises a cause du risque d'adressage a une memoire non valide dans le
process receveur (ca doit meme etre ca d'ailleurs!)
Mais en tout cas, je vais essayer avec WM_COPYDATA, ou RegisterWindowMessage
S'il y a d'autres solutions, je suis preneur, pour l'info.
Merci en tout cas, parce que c clair que je n'avais pas pense au pb de
l'adressage.
:)
Avatar
Remi Thomas
toms wrote:
bonjour a tous!
j'ai deux applications differentes qui tournent en meme temps.
Je veux envoyer un message de l'ne vers l'autre, mais un message
personnalise (WM_USER + XXX)
Or SendMessage et PostMessage ne l'autorisent pas.
Quelqu'un aurait-il une solution a me proposer?
Merci!
toms



PostMessage fonctionne très bien entre application mais sans pointeurs vers
structure dans les arguments.
Les Event (voir CreateEvent) sont des objets de synchronisation unique que
tu peux ouvrir dans plusieurs applications.
Tu peux aussi partager les Memory Mapped file (= fichier temporaire)

Avec ces deux technologies tu peux partager des structures entre
applications.

Sinon tu peux aussi utiliser les Pipe, les sockets, COM, le presse papier
(pas très beau techniquement parlant mais peut dépanner par sa mise en
oeuvre rapide), voir une base de données.

Enfin sous .NET tu peux utiliser le remoting.

Rémi

--
Rémi Thomas - MVP Visual Studio .NET
Développeur Windows indépendant
http://www.xtware.com/cv
Avatar
toms
> PostMessage fonctionne très bien entre application mais sans pointeurs


vers
structure dans les arguments.
Les Event (voir CreateEvent) sont des objets de synchronisation unique que
tu peux ouvrir dans plusieurs applications.
Tu peux aussi partager les Memory Mapped file (= fichier temporaire)

Avec ces deux technologies tu peux partager des structures entre
applications.

Sinon tu peux aussi utiliser les Pipe, les sockets, COM, le presse papier
(pas très beau techniquement parlant mais peut dépanner par sa mise en
oeuvre rapide), voir une base de données.

Enfin sous .NET tu peux utiliser le remoting.



?? connait pas! je vais chercher ca
merci!