Problème de retour de dll sous l?API32

Signaler
Messages postés
107
Date d'inscription
lundi 7 février 2011
Statut
Membre
Dernière intervention
17 février 2018
-
Messages postés
107
Date d'inscription
lundi 7 février 2011
Statut
Membre
Dernière intervention
17 février 2018
-
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

2 réponses

Messages postés
1466
Date d'inscription
vendredi 2 janvier 2004
Statut
Modérateur
Dernière intervention
14 février 2014
1
salut,

Oui, PeekMessage() ou le multithreading.

@++
Messages postés
107
Date d'inscription
lundi 7 février 2011
Statut
Membre
Dernière intervention
17 février 2018

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()