Masure | Bon voila je dois créer une DLL pour gérer les hook (capture d'événements) de manière a écouter tous les évenement système et à les envoyer à une application future. Pour l instant c'est une appli de test toute simple.
Mon problème est le suivant. Lors de l'initialisation de la DLL, je dois récupérer son handle pour le refiler à l'application pour qu'ils puissent communiquer (normal). Et comme handle je me tape 1 en retour... et apres lors de l execution de l appli qui load la dll "EAccessViolation" comme par hazard.
Le code de la DLL, tout se compile bien
Code :
- #include <vcl.h>
- #include <windows.h>
- #pragma hdrstop
- #pragma argsused
- // Définition de la structure de la zone mémoire partagée
- typedef struct _TDonnees
- {
- HHOOK MouseHookHandle; // Handle du hook de la souris
- HHOOK KeybdHookHandle; // Handle du hook du clavier
- HWND hDestWindow; // Handle de la fenêtre à laquelle le hook du clavier doit les données
- // Mettez ici toutes les données que vous voulez partager
- } TDonnees;
- // Déclaration des variables globales de la DLL
- HANDLE MemPartagee; // Handle de la zone de mémoire partagée
- TDonnees * VueDonnees; // Pointeur vers la zone de mémoire
- HINSTANCE HInst; // Handle d'intance de la DLL
- // Déclaration des fonctions de la DLL
- void InitHook(HWND hDest);
- void EndHook();
- LRESULT CALLBACK MouseProc(int nCode,WPARAM wParam,LPARAM lParam);
- LRESULT CALLBACK KeybdProc(int nCode,WPARAM wParam,LPARAM lParam);
- // fonction d'initialisation de la DLL
- int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
- {
- HInst = hinst;
- switch (reason)
- {
- case DLL_PROCESS_ATTACH : // à la création de l'instance de la DLL
- // Attachement d'une zone de mémoire partagée (notez le cast)
- MemPartagee = CreateFileMapping((HANDLE)0xFFFFFFFF, // On map un espace mémoire
- NULL, // Pas d'informations de sécurité
- PAGE_READWRITE, // Partage en lecture/écriture
- 0, // Taille de la zone réservée sur 64 bits (32 bits de poid fort)
- sizeof(TDonnees), // 32 bits de poids faible
- "RMS" ); // Nom de la zone réservée
- // Création d'une vue pour pouvoir accéder à la zone de mémoire partagée (notez le cast)
- VueDonnees = (TDonnees *)(MapViewOfFile((HANDLE)MemPartagee, // Zone sur laquelle créer la vue
- FILE_MAP_WRITE, // Mode d'accès en lecture/écriture
- 0, 0, // Offset de début de la vue sur 64 bits
- 0)); // Taille de la vue (0 = tout)
- break;
- case DLL_PROCESS_DETACH : // au détachement de la DLL
- // Destruction de la vue sur la zone de mémoire partagée
- UnmapViewOfFile((LPVOID)VueDonnees);
- // Détachement de la zone de mémoire partagée
- CloseHandle(MemPartagee);
- break;
- default :
- // DLL_THREAD_ATTACH, DLL_THREAD_DETACH
- break;
- }
- return 1;
- }
- void _export InitHook(HWND hDest) // _export est spécifique à BCB
- {
- // Installation du hook sur la souris
- VueDonnees->MouseHookHandle = SetWindowsHookEx(WH_MOUSE, // Créer un hook sur la souris
- (HOOKPROC)MouseProc, // Utiliser la fonction MouseProc
- HInst, // Dans la DLL d'instance HInst
- 0); // Pour tous les threads
- // Installation du hook pour le clavier
- VueDonnees->KeybdHookHandle = SetWindowsHookEx(WH_KEYBOARD, // Créer un hook sur le clavier
- (HOOKPROC)KeybdProc, // Utiliser la fonction KeybdProc
- HInst, // Dans la DLL d'instance HInst
- 0); // Pour tous les threads
- // Partage de la fenêtre destinatrice des données du clavier
- VueDonnees->hDestWindow = hDest;
- }
- void _export EndHook()
- {
- // Supression des hooks
- UnhookWindowsHookEx(VueDonnees->MouseHookHandle);
- UnhookWindowsHookEx(VueDonnees->KeybdHookHandle);
- }
- #define WMAP_MOUSEMOVE WM_APP + 1
- LRESULT CALLBACK _export MouseProc(int nCode,WPARAM wParam,LPARAM lParam)
- {
- // On envoie un message WMAP_MOUSEMOVE à chaque fois que
- // l'utilisateur déplace la souris
- if (wParam == WM_MOUSEMOVE)
- PostMessage(VueDonnees->hDestWindow, WMAP_MOUSEMOVE, 0, 0);
- return CallNextHookEx(VueDonnees->MouseHookHandle,nCode,wParam,lParam);
- }
- #define WMAP_KEYBOARDPRESS WM_APP + 2
- LRESULT CALLBACK _export KeybdProc(int nCode,WPARAM wParam,LPARAM lParam)
- {
- // On envoie un message WMAP_KEYBOARDPRESS à chaque fois que
- // l'utilisateur presse la touche CONTROL
- if (wParam == VK_CONTROL)
- PostMessage(VueDonnees->hDestWindow, WMAP_KEYBOARDPRESS, 0, 0);
- return CallNextHookEx(VueDonnees->KeybdHookHandle,nCode,wParam,lParam);
- }
|
La ptite appli qui utilise la DLL
Code :
- #include <vcl.h>
- #pragma hdrstop
- #include "testHook.h"
- //---------------------------------------------------------------------------
- #pragma package(smart_init)
- #pragma resource "*.dfm"
- TForm1 *Form1;
- //---------------------------------------------------------------------------
- __fastcall TForm1::TForm1(TComponent* Owner)
- : TForm(Owner)
- {
- bHook = false; // Les hooks ne sont pas initialisés
- hinstDLL = LoadLibrary("hooksClSo.dll" ); // Chargement de la librairie hinstDLL = 1 a ce moment et je crois que c'est pas cool
- if (!hinstDLL) // Erreur lors du chargement de la librairie ?
- Application->MessageBox("Impossible de charger la librairie.","gloups",MB_OK);
- else
- {
- // On récupère les adresses des fonctions
- InitHooks = (TInitFunc)GetProcAddress(hinstDLL, "_InitHook" );
- EndHooks = (TEndFunc)GetProcAddress(hinstDLL, "_EndHook" );
- bHook = true;
- InitHooks(Application->Handle); // On initialise les hooks
- }
- }
- void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
- {
- if (bHook) // Si les hooks sont actifs, on les supprime avant de quitter
- EndHooks();
- Action = caFree;
- }
- void __fastcall TForm1::DeplSouris(TWMNoParams &p)
- {
- TPoint pt ;
- GetCursorPos ( & pt) ;
- EditX->Text = IntToStr(pt.x);
- EditY->Text = IntToStr(pt.y);
- }
- void __fastcall TForm1::PressionControl(TWMNoParams &p)
- {
- chkCtrl->Checked = true;
- }
- void __fastcall TForm1::CheckBox1Click(TObject *Sender)
- {
- if (!hinstDLL) // La librairie n'est pas chargée, inutile de continuer
- Close();
- else if (CheckBox1->Checked) // Activer les hooks
- {
- InitHooks(Application->Handle); // On initialise les hooks
- }
- else // Désactiver les hooks
- EndHooks(); // On supprime les hooks
- }
|
voila le topo je sais pas pourquoi hinst = 1, enfin je suis vraiment pas fort en prog alors c'est ptet normal mais ca m etonnerait. De toute facon le EAccessViolation est un mystere ensuite ! Message édité par Masure le 10-01-2003 à 21:13:54
|