ArthurAuguste
Messages postés107Date d'inscriptionlundi 7 février 2011StatutMembreDernière intervention17 février 2018
-
4 mars 2011 à 06:58
ArthurAuguste
Messages postés107Date d'inscriptionlundi 7 février 2011StatutMembreDernière intervention17 février 2018
-
9 mars 2011 à 15:16
J'ai un .exe (une fenêtre) qui tourne donc avec quelque part une boucle :
while( GetMessage( &message, NULL, 0, 0))
{
TranslateMessage( &message );
DispatchMessage( &message );
}
et qui récupère quelque part dans une CALLBACK les messages WM_COMMAND.
Parmi mes messages WM_COMMAND, j'ai en particulier les deux suivants :
1.- un message (case message1 :) qui exécute une fonction 1 dans une DLL,
je passe sur le détail du chargement de la DLL, retenons simplement qu'après son chargement j'ai simplement :
fonction1dll() ;
suivi du break; habituel
2.- un autre message (case message2) qui exécute une fonction 2 dans la même DLL,
j'ai donc sous un autre (case message2:) l'appel de la fonction 2 :
fonction2dll() ;
toujours suivi du break; habituel
voilà pour ma fenêtre en .exe
Pour ce qui concerne ma dll :
Ma fonction 1 exécute un HOOK et se met à boucler volontairement pour récupérer par sa propre CALLBACK les messages des évènements piégés sur une boucle du style :
while( (GetMessage( &messdll, NULL, 0, 0))&&(runhook))
{
TranslateMessage( &messdll );
DispatchMessage( &messdll );
}
avec runhook initialisé à true.
Ma fonction 2 ne fait elle aucune boucle, elle a pour but d'arrêter le HOOK lancé par la fonction 1 et de stopper la boucle de la fonction 1. Ma fonction 2 se contente donc simplement de faire le UnHook nécessaire puis de faire passer runhook à false ce qui on le voit permet de sortir de la boucle GetMessage de la fonction 1.
Comportement de l'ensemble :
Quand je lance la fonction 1 tout se passe comme voulu :
Le hook de la DLL s'exécute correctement et en parallèle je peux continuer à utiliser le .exe de ma fenêtre pour exécuter d'autres commandes (bien noter cependant que je ne suis toujours pas revenu sur le break; qui suit l'appel à la fonction 1).
Quand je lance la fonction 2 le hook s'arrête comme prévu, je reviens bien sans problème sur le break ; qui suit l'appel de la fonction 2, mais en parallèle comme la fonction 1 sort de sa boucle interne je reviens aussi sur le break; qui suit la fonction 1 et c'est là qu'il y a un problème : ceci tue mon .exe donc ma fenêtre ce qui n'était pas le but recherché !!
J'espère avoir été clair dans mes explications, ce problème est-il résoluble ?
Merci
ArthurAuguste
Messages postés107Date d'inscriptionlundi 7 février 2011StatutMembreDernière intervention17 février 2018 9 mars 2011 à 15:16
Merci pour la réponse, mais entre-temps j'ai trouvé, j'avais fait l'erreur suivante:
ci-après le point d'entrée de la fonction 1 dans ma dll:
extern "C" __declspec(dllexport) DWORD WINAPI SetHook(LPVOID lpParameter)
ci-après le point d'entrée de la fonction 2 dans ma dll:
extern "C" __declspec(dllexport) BOOL WINAPI StopHook()
ci-après l'appel de ma fonction 1 dans le programme principal:
dllEntryAdd1();
ci-après l'appel de ma fonction 2 dans le programme principal:
dllEntryAdd2();
Je pensais à tort que le paramètre (LPVOID lpParameter) qui n'était pas utilisé ne gênait pas, en fait ma fonction 1 s'exécutait normalement mais c'est seulement au moment où elle se terminait et où elle revenait dans le programme principal que le fait de l'avoir appelée sans paramètre alors qu'elle en attendait un, provoquait un décalage dans la pile qui me plantait mon programme principal. Donc grossière erreur!
Correction:
Nouveau point d'entrée de la fonction 1 dans ma dll:
extern "C" __declspec(dllexport) DWORD WINAPI SetHook()