Transmission de données d'une DLL à un EXE via SendMessage [Résolu]

Signaler
Messages postés
4
Date d'inscription
vendredi 17 octobre 2003
Statut
Membre
Dernière intervention
29 novembre 2008
-
Messages postés
4
Date d'inscription
vendredi 17 octobre 2003
Statut
Membre
Dernière intervention
29 novembre 2008
-
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

Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
20
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++
Messages postés
933
Date d'inscription
dimanche 1 avril 2001
Statut
Modérateur
Dernière intervention
9 janvier 2012
1
Salut,

Le FileMapping est certainement ta solution.

@+
Arnotic,
Admin CS,
http://dev.winsysdev.com
Messages postés
966
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
4 mars 2010
4
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.
Messages postés
4
Date d'inscription
vendredi 17 octobre 2003
Statut
Membre
Dernière intervention
29 novembre 2008

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 ?
Messages postés
966
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
4 mars 2010
4
Comment crées-tu la zone de mémoire partagée?
Messages postés
4
Date d'inscription
vendredi 17 octobre 2003
Statut
Membre
Dernière intervention
29 novembre 2008

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.