Communication entre une application console c# et une dll c++ par le biais de l' [Résolu]

Messages postés
8
Date d'inscription
vendredi 30 mai 2003
Dernière intervention
4 juillet 2008
- - Dernière réponse : Gothamma
Messages postés
2
Date d'inscription
mardi 21 août 2007
Dernière intervention
17 mai 2011
- 17 mai 2011 à 18:58
Salut à tous,

Je crois que le titre explique bien ce que je souhaite faire : je n'arrive pas à communiquer entre ma dll et mon appli par le biais de SendMessage().

J'utilise XP Pro SP3 et Visual Studio 2008, la solution qui contient 2 projets est disponible : ici

La dll fonctionne, son appel par le biais de pinvoke et la mise en place du hook global aussi.
Apparement une appli console c# ne possède pas de "message pump" donc j'utilise NativeWindow et lui assigne le handle de la fenêtre console pour pouvoir modifier le comportement de WndProc(). Mais malheureusement je ne reçois aucun message.

Je vous demande donc de l'aide.

Question bonus : comment faire pour rendre actif les breakpoints (de ma dll) et pour debug la dll ?

Par avance merci à tous les contributeurs.
Afficher la suite 

Votre réponse

8 réponses

Meilleure réponse
Messages postés
3248
Date d'inscription
lundi 25 avril 2005
Dernière intervention
27 octobre 2012
3
Merci
Salut, essaye avec "une message only window", tu as un exemple dans mon fichier >RawInput.cs<

Merci Lutinore 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 103 internautes ce mois-ci

Commenter la réponse de Lutinore
Messages postés
3248
Date d'inscription
lundi 25 avril 2005
Dernière intervention
27 octobre 2012
3
Merci
le code de la fonction DllMain est excuté par l'attribut DllImport, il faut bien la chargée la dll.. vu le code dans ta source cpp LoadLibrary et FreeLibrary sont inutiles.

Ce n'est pas SendInput qui bloque apparemment, pas "d'acces denied" non plus.. si tu affiches une vraie forme suivis d'Application.Run tu recevras bien tes messages WM_USER dans la console.

Invisible invisible = new Invisible();
Install( invisible.Handle );
           
Form f = new Form( );
Application.Run( f );

Je ne vois pas pourquoi Application.Run tout seul ne suffit pas.. J'ai pas testé plus que ça..

Merci Lutinore 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 103 internautes ce mois-ci

Commenter la réponse de Lutinore
Messages postés
8
Date d'inscription
vendredi 30 mai 2003
Dernière intervention
4 juillet 2008
0
Merci
Merci Lutinore ça avance un peu mais c'est tjs pas complet :

En utilisant ta classe j'arrive maintenant à récupérer les messages de la création de la fenêtre (WM_GETMINMAXINFO, WM_NCCREATE, WM_NCCALCSIZE et WM_CREATE) mais je ne reçois tjs rien de ma dll.

La version initiale du projet est renommée "Hook dll.old" et celle contenant ta classe est "Hook dll.zip" (lien dans le premier message). Si tu as le temps de te pencher dessus... Merci.
Commenter la réponse de dekai
Messages postés
3248
Date d'inscription
lundi 25 avril 2005
Dernière intervention
27 octobre 2012
0
Merci
J'ai regardé rapidement.. tu installes un hook local ça me semble plutôt normal que tu ne reçois rien dans une appli console, utilises plutôt un hook global WH_KEYBOARD_LL. En C# on utilise quasi jamais LoadLibrary/FreeLibrary, c'est l'attribut DllImport qui gère ça.. Puisque ta dll en C/C++ contient un simple hook clavier tu peux l'écrire totalement en C#.

Exemples :

http://www.csharpfr.com/infomsg_EVENEMENT-IMPORTE-OU-SUR-ECRAN_745061.aspx
http://www.csharpfr.com/infomsg_HOOK-CLAVIER_830892.aspx
Commenter la réponse de Lutinore
Messages postés
8
Date d'inscription
vendredi 30 mai 2003
Dernière intervention
4 juillet 2008
0
Merci
Je crois que tu te trompes, enfin pas tout à fait mais on va éclaircir tout ça :

- Effectivement WH_KEYBOARD_LL est un hook global par défaut, mais j'install bien un hook global pour WH_KEYBOARD. En effet WH_KEYBOARD peut avoir une portée "thread" ou "global" (cf tableau dans remarks). C'est le 4ème argument de SetWindowsHookEx() qui détermine la portée de hook.

- Mon premier point est confirmé : le hook global fonctionne bien. A chaque pression d'une touche au clavier je log dans "c:\log.txt" la valeur 0 qui doit correspondre à HC_ACTION.

Voilà pour le hook

Pour ce qui est de Dllimport bien sur que je l'utilise mais plutôt que
d'exporter plusieurs fonctions de ma dll j'utilise les mecanismes LoadLibrary/FreeLibrary
afin d'executer le code de la fonction DllMain (non joignable
autrement). De toute façon le problème n'est pas là le hook fonctionne
bien.

Réaliser le hook en C# n'a aucun interêt pour moi : en réalité je me fou totalement du type du hook utilisé, à terme j'aurai besoin de WH_CBT, WH_SHELL et WH_SYSMSGFILTER. Mais pour des raisons de tests j'utilise WH_KEYBOARD.

Comme mon titre l'indique c'est uniquement la communication entre ma dll et mon appli console qui m'interesse et me pose problème. Je pense que le soucis est au niveau de la fonction SendMessage (ligne 31 de dllmain.cpp).
Commenter la réponse de dekai
Messages postés
8
Date d'inscription
vendredi 30 mai 2003
Dernière intervention
4 juillet 2008
0
Merci
Effectivement tu as raison : pas besoin de LoadLibrary/FreeLibrary (mea-culpa je me suis bien planté).

Je ne comprends pas pourquoi ta solution fonctionne mais ça marche donc un grand merci à toi pour le temps que tu m'as consacré.
Commenter la réponse de dekai
Messages postés
2
Date d'inscription
mardi 21 août 2007
Dernière intervention
17 mai 2011
0
Merci
Bonjour,

Cela fait 3 ans, mais serait il possible d'avoir accès à votre projet ?

Merci
Commenter la réponse de Gothamma
Messages postés
2
Date d'inscription
mardi 21 août 2007
Dernière intervention
17 mai 2011
0
Merci
Le lien vers le projet zippé ne marche plus depuis le temps.
Merci
Commenter la réponse de Gothamma

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.