|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
![]() ![]() Inscription : septembre 2008 Messages : 2 857 ![]() |
Bonjour à tous !
Je vous propose aujourd'hui un nouveau tutoriel sur l'envoi de chaînes ou de structures par PostMessage en utilisant la table d'atomes. N'hésitez pas à faire part de vos réactions Bonne lecture ! |
|
|
20
|
|
|
#2 | ||
|
Expert Confirmé Sénior
![]() ![]() Paul TOTHFreelance Inscription : novembre 2002 Messages : 4 427 ![]() |
Bonjour,
Personnellement j'utilise un autre approche que je trouve bcp plus simple Code :
__________________
Developpez.com: Mes articles, forum FlashPascal Entreprise: Execute SARL Produits : UPnP, RemoteOffice, FlashPascal Embarcadero : Ile de la Réunion, Dephi, C++Builder, RADPHP...TVA à 8,5% |
||
|
10
|
|
|
#3 |
![]() ![]() Inscription : septembre 2008 Messages : 2 857 ![]() |
C'est possible en effet
![]() Par record, il faudra prendre soin de faire appel à GetMem/FreeMem (New/Dispose) et pas simplement déclarer une variable locale à la fonction ! Mon approche se veut cependant plus universelle et autorise l'envoi entre processus |
|
|
00
|
|
|
#4 |
|
Expert Confirmé Sénior
![]() Développeur C++\Delphi Inscription : juillet 2006 Messages : 9 199 ![]() |
J'ai jamais eu le temps de m'occuper de [QR] Comment passer une string dans un message Windows ? qui utilise WM_COPYDATA qui fonctionnee en inter-processus
__________________
Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y ! Attention Troll Méchant ! ![]() "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer ! L'ignorance n'excuse pas la médiocrité ! L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde) Il faut avoir le courage de se tromper et d'apprendre de ses erreurs Halte à la ségrégation des Cinémas, VO sur Paris, VF en Banlieue, Abonnement résilié ! |
|
|
00
|
|
|
#5 |
![]() ![]() Inscription : septembre 2008 Messages : 2 857 ![]() |
...mais qui est obligatoirement synchrone par SendMessage
|
|
|
00
|
|
|
#6 |
|
Membre Expert
![]() Dev/For/Vte/Ass Inscription : août 2008 Messages : 1 499 ![]() |
@AndNotY,
Salut, j'ai parcouru tout ton article, et à la fin je me suis demandé à quoi cela peut servir en cas réel ? (je préfère passer pour un idiot, mais je pose quand même la question...) Est-ce un moyen de transmettre des données (tableau, chaîne, nombre) entre 2 applications ?
|
|
|
00
|
|
|
#7 | ||||||
![]() ![]() Inscription : septembre 2008 Messages : 2 857 ![]() |
Tu peux envoyer tout ce que tu veux, entre threads ou entre processus
Voici deux exemples. Rediriger la sortie d'une application console. Admettons que cycliquement, tu lances en tâche de fond une application console invisible pour de la maintenance (backup, mise à jour...). Tu aimerais cependant que l'utilisateur soit informé de l'avancement ou d'une éventuelle erreur. Tu pourrais bien sûr :
Code :
Hook. Tu aimerais intercepter le retour de traitement d'un message par une fenêtre quelconque. Tu vas pour cela injecter une DLL dans les processus par SetWindowsHookEx. Mais un hook peut être très pénalisant pour le système et le ralentir considérablement si le traitement à effectuer est long. Jusqu'à Windows XP, on privilégiait le passage d'info par fichier mappé. Les lectures et écritures devant bien sûr être synchronisées par mutex. Depuis Vista et l'UAC, C'est fini ! La DLL injectée dans une application de niveau d'intégrité inférieur (par exemple Internet Explorer en mode protégé) n'aura pas accès au fichier mappé. Une violation est générée et c'est le deadlock assuré de l'application cible. On pourrait à nouveau utiliser WM_COPYDATA, mais il faudra que notre application soit très réactive. Imagine un hook souris tellement pénalisant que le curseur avance par saccade ! Router simplement les informations par PostMessage ? Bien sûr si peu d'informations nous intéressent et tiennent dans WParam/LParam. Mais il ne faut pas espérer en récupérer plus par la suite par AttachThreadInput (UAC quand tu nous tiens...). Intercepter le retour d'un message se fait en plaçant un hook de type WH_CALLWNDPROCRET. Un pointeur est passé dans LParam correspondant à la structure suivante : Code :
Code :
|
||||||
|
|
40
|
|
|
#8 | |||||||||
|
Expert Confirmé Sénior
![]() Développeur C++\Delphi Inscription : juillet 2006 Messages : 9 199 ![]() |
Citation:
Sinon WM_COPYDATA utilise une structure COPYDATASTRUCT de taille fixe mais permet justement de gérer un buffer de longueur variable via se membres cbData et lpData On peut donc strictement définir un buffer de la taille exacte de la donnée devant être envoyé Sinon, pourquoi ne pas avoir utiliser BinToHex qui aurait fait le travail de conversion en Hexa bien plus rapidement que les nombreuses réallocation\concaténation de Data.Bytes même si FastMM le gère bien mieux que l'ancien gestionnaire de mémoire Tient, j'ai fait un petit dev hier que l'on m'a réclamé pour simplifier la vie de l'utilisateur un programme A doit lancer un programme B A étant déjà loggué, B est lancé en mode "AutoLogin" pour que l'utilisateur n'est pas retapé son Login+PW Dans d'autres programmes qui font la même chose, le login est passé sur la ligne de commande, en clair pour certaines et d'autres en chiffré Cela reste une jolie faille de sécurité puisque cela permet un login sans PW Mon prédecesseur n'avait pas du tout conscience de la sécurité ! Je passe un HWND qui servirait ensuite pour un échange entre A et B d'un GUID servant d'ID de session qui aboutit à l'authentification, c'est déjà plus difficile à choper (un hook) je viens d'en extraire une petite classe plus générique, on voit tout de suite qu'avec un peu d'effort que l'on pourrait hériter d'un TStream et utiliser un TBinaryReader\TBinaryWriter dessus la Version C++, si j'ai le temps, je la tenterais en Delphi Code c++ :
Code c++ :
//--------------------------------------------------------------------------- Code c++ :
Code dfm :
__________________
Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y ! Attention Troll Méchant ! ![]() "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer ! L'ignorance n'excuse pas la médiocrité ! L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde) Il faut avoir le courage de se tromper et d'apprendre de ses erreurs Halte à la ségrégation des Cinémas, VO sur Paris, VF en Banlieue, Abonnement résilié ! |
|||||||||
|
|
10
|
|
|
#9 | |||
![]() ![]() Inscription : septembre 2008 Messages : 2 857 ![]() |
Citation:
Maintenant, mon but était vraiment de faire de l'asynchrone... Citation:
Comme j'aurais pu aussi définir une chaîne de 2x la taille de la donnée et travailler sur l'index du caractère.Mais je suis un pervers et au départ je comptais convertir un octet sur 10 bits (actuellement 16 bits) pour utiliser au mieux les 255 octets à disposition. Puisqu'une des contraintes est : pas de byte à "0" son codage aurait été 1000010000 (en ajoutant toujours "1"). Mais ça devenait un peu compliqué et le tuto n'aurait plus été "Confirmé", mais "Expert" ![]() Mais j'aurais dû plus simplifier ! Citation:
mais récupéré par hook pour exécuter du code dans le processus cible |
|||
|
|
00
|
|
|
#10 |
|
Membre du Club
![]() Inscription : mars 2007 Messages : 96 ![]() |
c'est Noël
Dans l'endroit et au bon moment que ce tutoriel car je passais des heures pour apprendre quelques choses sur les HOOK(s). Merci pour ce tutoriel et les interventions des chères membres |
|
|
00
|
Copyright © 2000-2013 - www.developpez.com