begin process at 2012 05 30 18:45:55
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C++ & C++ .NET

 > 

Windows

 > 

System

 > 

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


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

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

samedi 29 mars 2008 à 20:25:19 | Transmission de données d'une DLL à un EXE via SendMessage

enkyll

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 ?
samedi 29 mars 2008 à 21:00:32 | Re : Transmission de données d'une DLL à un EXE via SendMessage

Arnotic

Administrateur CodeS-SourceS
Salut,

Le FileMapping est certainement ta solution.

@+
Arnotic,
Admin CS,
[ Lien ]
samedi 29 mars 2008 à 21:38:36 | Re : Transmission de données d'une DLL à un EXE via SendMessage

juju12

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.

samedi 29 mars 2008 à 22:30:14 | Re : Transmission de données d'une DLL à un EXE via SendMessage

BruNews

Administrateur CodeS-SourceS
Réponse acceptée !
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++
dimanche 30 mars 2008 à 03:55:18 | Re : Transmission de données d'une DLL à un EXE via SendMessage

enkyll

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 ?
dimanche 30 mars 2008 à 14:02:16 | Re : Transmission de données d'une DLL à un EXE via SendMessage

juju12

Comment crées-tu la zone de mémoire partagée?

samedi 18 octobre 2008 à 22:38:04 | Re : Transmission de données d'une DLL à un EXE via SendMessage

enkyll

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.


Cette discussion est classée dans : exe, données, sendmessage, dll, transmission


Répondre à ce message

Sujets en rapport avec ce message

Dll [ par DeAtHCrAsH ] Salut,Je dispose d'une DLL et deux de EXE.Ma DLL permet d'initialiser une connection TCP/IP sur le port  5678, et d'y envoyer des données.Je lance une Inclure MFC42D.dll dans mon exe [ par freepouy18 ] Bonjour tlm,J'aimerai inclure la dll MFC42D.dll dans mon executable pour lancer mon exe depuis n'importe quel pc (sans visual).Merci HELP GTK - exe portable [ par UnderFlow ] Bonjour à toutes et à tous, Afin de développer très rapidement une interface graphique en C++, j'ai utilisé Glade (éditeur graphique) et GTK (bibliot c++ [ par halwas ] bonne programationbonjour,j'ai fais un programme en c++ , j'ai deplacé lefichier.exe sur une autre poste alors l'exe ne trav ShellExecute dans une DLL executer par Winlogon de la base de registre [ par guitoulefoux ] Bonjour,J'ai fais une DLL qui s'execute au Winlogon de mon OS (base de registre).Cette DLL doit normalement faire plusieurs tests et executer une autr Données dans DLL accessibles à divers processus (sous dev-C++) [ par graig2 ] Salut à tous, Voici ma toute première question sur ce forum, merci pour votre aide : Est ce qu'une DLL appelée par divers processus distincts peut c Binder/Lanceur [ par Jielde ] Salut, voila je cherche un prog en C/C++ qui permet de joindre un fichier dll avec un exe dans un même fichier. exemple : vb6fr.dll + Install.exe = C# probleme d'exportation d'exe [ par golum ] voila g écrit un prog en C# mais bon si je fait mon exe il me manque une dll de base pour l'écécuter (cette dll est payante).suis-je oubligé de faire SendMessage vers une fenêtre minimisée [ par Keenes ] Bonjour,Le sujet du message n'étant pas très explicite, voici de quoi il s'agit :Je cherche à réaliser une logiciel de capture d'écran, comme il en ex [WIN32] Comment faire un exe qui n'importe pas de DLL [ par KeniiyK ] Bah voila tout est dans le titre, j'ai deja vu plusieurs EXE qui lorsqu'on leur fait un "dumpbin /imports" dessus  ne renvoie que la table des section


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,780 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales