begin process at 2008 09 06 18:36:40
1 237 887 membres
272 nouveaux aujourd'hui
14 314 membres club

Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum.
Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : Communication entre une application console c# et une dll c++ par le biais de l'API SendMessage() [ Windows / API ] (dekai)

Communication entre une application console c# et une dll c++ par le biais de l'API SendMessage() le 02/07/2008 20:18:09

dekai
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.



Re : Communication entre une application console c# et une dll c++ par le biais de l'API SendMessage() le 03/07/2008 00:22:41

Lutinore
(Admin CS)
Réponse acceptée !
Salut, essaye avec "une message only window", tu as un exemple dans mon fichier >RawInput.cs<

Re : Communication entre une application console c# et une dll c++ par le biais de l'API SendMessage() le 03/07/2008 13:23:02

dekai
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.

Re : Communication entre une application console c# et une dll c++ par le biais de l'API SendMessage() le 03/07/2008 14:50:37

Lutinore
(Admin CS)

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


Re : Communication entre une application console c# et une dll c++ par le biais de l'API SendMessage() le 03/07/2008 16:34:06

dekai
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).

Re : Communication entre une application console c# et une dll c++ par le biais de l'API SendMessage() le 03/07/2008 21:52:02

Lutinore
(Admin CS)
Réponse acceptée !

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..


Re : Communication entre une application console c# et une dll c++ par le biais de l'API SendMessage() le 04/07/2008 13:22:28

dekai
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é.


Classé sous : sendmessage, dll, console, communication, biais

Participer à cet échange

Pub



Appels d'offres

CalendriCode

Septembre 2008
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
2930     

Téléchargements

Logiciels à télécharger sur le même thème :

Boutique

Boutique de goodies CodeS-SourceS