begin process at 2010 03 22 15:31:12
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C#

 > 

Windows

 > 

API

 > 

Communication entre une application console c# et une dll c++ par le biais de l'API SendMessage()


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

Communication entre une application console c# et une dll c++ par le biais de l'API SendMessage()

mercredi 2 juillet 2008 à 20:18:09 | Communication entre une application console c# et une dll c++ par le biais de l'API SendMessage()

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.


jeudi 3 juillet 2008 à 00:22:41 | Re : Communication entre une application console c# et une dll c++ par le biais de l'API SendMessage()

Lutinore

Administrateur CodeS-SourceS
Réponse acceptée !
Salut, essaye avec "une message only window", tu as un exemple dans mon fichier >RawInput.cs<
jeudi 3 juillet 2008 à 13:23:02 | Re : Communication entre une application console c# et une dll c++ par le biais de l'API SendMessage()

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.
jeudi 3 juillet 2008 à 14:50:37 | Re : Communication entre une application console c# et une dll c++ par le biais de l'API SendMessage()

Lutinore

Administrateur CodeS-SourceS

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

jeudi 3 juillet 2008 à 16:34:06 | Re : Communication entre une application console c# et une dll c++ par le biais de l'API SendMessage()

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).
jeudi 3 juillet 2008 à 21:52:02 | Re : Communication entre une application console c# et une dll c++ par le biais de l'API SendMessage()

Lutinore

Administrateur CodeS-SourceS
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..

vendredi 4 juillet 2008 à 13:22:28 | Re : Communication entre une application console c# et une dll c++ par le biais de l'API SendMessage()

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


Cette discussion est classée dans : sendmessage, dll, console, communication, biais


Répondre à ce message

Sujets en rapport avec ce message

[C#][débutant] Empêcher écriture dans la console [ par hmarchal ] Bonjour à tous,j'utilise une dll qui n'appartient pas au framework .Net et lorsque que j'instancie un objet d'une classe de cette dll, j'ai un warning Debug DLL [ par RegVB ] Bonjour,J'ai une solution C# dans lequel j'ai un projet principal console et un projet DLL utilisé par mon projet console. Existe-t-il un moyen lorsqu Libérer une dll [ par pingou8313 ] Bonjour, j'ai une appli qui utilise une dll pour piloter du matériel sur port série. Cette dll permet d'ouvrir la communication sur le port. Par cont Communication IRDA [ par marielle1 ] Bonjour à tous,j'ai un souci qui m'empoisonne la vie ...je dois communiquer via un TSP équipé en windows CE 5.0 avec un périphérique par infra-rouge. Utilisation de OpenNETCF.Desktop.Communication.dll [ par xmox667 ] Salut à tous,J'ai une petite application qui utilise la dll suivante OpenNETCF.Desktop.Communication.dll.Elle fonctionnait bien mais mais maintenant j communication entre un service windows et une DLL [ par khachbi ] bonjour,j'ai développé un service en C#, dans ce service j'ai implimenté des methodes spécifiques.la dll que je veux developper fait appel au fonction creation d'un dll a partir d'un programme console [ par draonix ] Bonjour à tous et à toute, Je pose mon problème (vous trouverez peut être la question débile mais je préfère la poser que de rester dans mon ignorance Debuger une dll c++ en CSHARP [ par custo76 ] Bonjour à tous,je m'explique:J'ai une dll en c++ que j'ai besoin de debuger en CSHARP, mais je ne sais pas trop comment faire.Lorsque que je compile l Dll et probleme form.show [ par marc_dd ] Bonjour à tous, J'ai un soucis avec une de mes applications, j'ai un dll contenant  une form, cette dll est appelée à partir d'une autre application e Microsoft.SqlServer.Rmo.dll [ par shedex ] bonjour, savez vous où je peut télécharger la dll : Microsoft.SqlServer.Rmo.dll pour mon application c#?merci d'avance


Nos sponsors


Appels d'offres

Sondage...

CalendriCode

Mars 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode

 
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 : 1,825 sec (4)

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