Transmission de données d'une DLL à un EXE via SendMessage

Résolu
enkyll Messages postés 3 Date d'inscription vendredi 17 octobre 2003 Statut Membre Dernière intervention 29 novembre 2008 - 29 mars 2008 à 20:25
enkyll Messages postés 3 Date d'inscription vendredi 17 octobre 2003 Statut Membre Dernière intervention 29 novembre 2008 - 18 oct. 2008 à 22:38
Bonsoir,

Je créé un petit programme de surveillance du clipboard par la mise en place d'un hook dans une DLL (Win32 API sans MFC).
L'ensemble fonctionne correctement.

Mon problème survient dans la communication DLL vers EXE :
J'essaie de passer des informations à l'EXE appelant depuis la DLL par sendmessage via un message user (WM_USER+1 en l'occurence mais peu importe).
La transmission de données uniques ne pose aucun problème (de type numérique ou caractère).
Le problème survient dans la transmission de structures.
Comment faire via sendmessage pour transmettre une structure par référence au programme appelant ?
N'y a t-il aucune solution avec un WM_USER sinon que de passer par WM_COPYDATA ?
J'ai presque tout essayé (le passage de la stucture, déclarée dans une zone mémoire partagée, via sendmessage, postmessage, sendnotifymessage) mais rien n'y fait.
Enfin presque : Depuis ma procédure d'interception de WH_CALLWNDPROC ça fonctionne mais pas depuis celle d'interception de WH_GETMESSAGE (plantage de l'EXE).

Quelqu'un pourrait me guider sur la bonne voie ?

6 réponses

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
29 mars 2008 à 22:30
Ce n'est pas la peine de transmettre les données, un pointeur dans un param de SendMessage suffit amplement.
Une adresse reste valide d'une dll vers un exe ant que la dll est bien dans l'espace mémoire du processus. Si c'est depuis tioute instance d'une dll qui est en hook global alors non.

ciao...
BruNews, MVP VC++
3
cs_Arnotic Messages postés 933 Date d'inscription dimanche 1 avril 2001 Statut Membre Dernière intervention 9 janvier 2012
29 mars 2008 à 21:00
Salut,

Le FileMapping est certainement ta solution.

@+
Arnotic,
Admin CS,
http://dev.winsysdev.com
0
cs_juju12 Messages postés 966 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 4 mars 2010 4
29 mars 2008 à 21:38
Tu peux également utiliser WriteProcessMemory(), tu réserves une zone dans ton programme et la dll écrit à chaque fois dedans avant d'envoyer ton message WM_USER+1.
0
enkyll Messages postés 3 Date d'inscription vendredi 17 octobre 2003 Statut Membre Dernière intervention 29 novembre 2008
30 mars 2008 à 03:55
Merci à tous pour vos réponses.
Je testerais le FileMapping  et WriteProcessMemory.
Je reste malgré tout de l'avis de BruNews pour la transmission de pointeur (principe de base de l'intercommunication des API Windows) mais c'est justement là que je coince.
Ma DLL esr un hook global et ce qui me choque c'est que :
Je peux envoyer le pointeur de ma structure à l'exe uniquement pour le message WM_DRAWCLIPBOARD de WH_CALLWNDPROC.
Exemple de structure à passer :
Typedef _MYSTRUCT {
    char* szData; // taille non signée car variable
    unsigned int iPID;
    etc.
} MYSTRUCT;
MYSTRUCT mystruct;
Je l'ai allouée, réservée à une zone mémoire partagée mais rien n'y fait.
(Dois je en plus de la passer en référence, affecter à chaque membre l'adresse d'un pointeur sa copie mémoire ?)

Ensuite quels que soient les messages mon exe plante à cause d'un mauvais adressage mémoire.
Idem donc pour le message WM_COPY de WH_CALLWNDPROC.
Pourquoi seul le message WM_DRAWCLIPBOARD supporte le passage de pointeur ou pourquoi les autres ne le supporte pas ?
Cela dit, j'ai effectué tant de tests (5 semaines que je galère sur ce problème qui n'est en fait à la base qu'un jeu entre collègues de bureau) que je peux me tromper entre ces 2 messages.
Mais ce que je peux affirmer sans faille c'est que le message WM_COPY de WH_GETMESSAGE n'est jamais passé là ou WM_DRAWCLIPBOARD est toujours arrivé.
Quelqu'un aurait une explication à cela ?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_juju12 Messages postés 966 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 4 mars 2010 4
30 mars 2008 à 14:02
Comment crées-tu la zone de mémoire partagée?
0
enkyll Messages postés 3 Date d'inscription vendredi 17 octobre 2003 Statut Membre Dernière intervention 29 novembre 2008
18 oct. 2008 à 22:38
Désolé de cette réponse tardive mais étant passé à autre chose j'avais oublié de cloturer ce post.
Mea culpa.
Comme BruNews l'avait expliqué, et puisque ma DLL est bien dans l'espace mémoire de mon processus, je passe à mon exe le pointeur sur les données (J'alloue une zone mémoire dans laquelle je place au début la structure même et à sa suite les données dynamiques. Les membres de la structure de type pointeur sont redéfinies à un pointeur relatif -- depuis le début de la zone mémoire -- sur leurs données correspondantes stockées donc contigument à la  structure).
Merci à tous pour votre aide.
0
Rejoignez-nous