Mon objectif est simple d'un point de vue conceptuel: je souhaite définir une fonction de connexion globale GetMessage qui utilise un descripteur de fichier partagé. Le problème se pose parce que d'après ma compréhension la DLL contenant la fonction de crochet est chargée plusieurs fois pour chaque processus, chacun avec leur propre "espace d'adressage". Pour cette raison, je suis amené à croire que je ne peux pas simplement gérer DLL_PROCESS_ATTACH de DllMain pour créer le fichier désiré, car plusieurs fichiers seraient créés avec des poignées différentes.Application aux DLL Global Hook
Une solution qui a été portée à mon attention est Named Pipes. Fondamentalement, l'application agirait comme la fin du serveur; il créerait le fichier une fois puis fournirait le handle de fichier aux clients DLL, donc chaque hook global utiliserait le même fichier.
Je n'arrive pas à faire fonctionner le code que j'ai recueilli. Dans l'application, je crée le fichier, définir la fonction globale de crochet, puis faire passer par cette boucle:
while(1)
{
HANDLE hPipe = CreateNamedPipe("\\\\.\\pipe\\pipename", PIPE_ACCESS_OUTBOUND,
PIPE_TYPE_BYTE|PIPE_READMODE_BYTE|PIPE_WAIT, PIPE_UNLIMITED_INSTANCES, 32, 32, 5000, NULL);
if(hPipe == INVALID_HANDLE_VALUE)
return 42;
if(!ConnectNamedPipe(hPipe, NULL))
return 43;
DWORD dwWritten;
WriteFile(hPipe, logFile, sizeof(logFile), &dwWritten, NULL);
FlushFileBuffers(hPipe);
DisconnectNamedPipe(hPipe);
CloseHandle(hPipe);
}
Je poignée la DLL_PROCESS_ATTACH de DllMain comme si:
case DLL_PROCESS_ATTACH:
{
HANDLE hPipe;
while(1)
{
hPipe = CreateFile("\\\\.\\pipe\\pipename", GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL);
if(hPipe != INVALID_HANDLE_VALUE)
break;
WaitNamedPipe("\\\\.\\pipe\\pipename", NMPWAIT_USE_DEFAULT_WAIT);
}
DWORD dwRead;
ReadFile(hPipe, logFile, sizeof(logFile), &dwRead, NULL);
CloseHandle(hPipe);
break;
}
En termes simples, il ne fonctionne pas, et je n'arrive pas à comprendre pourquoi. Y a-t-il quelque chose qui me manque ou qui ne va pas dans mon code?
Un autre problème que je n'arrive pas à comprendre est que l'application est bloquée dans une boucle infinie de service constant. Je veux configurer un événement que la DLL va définir dans certaines circonstances et amener l'application principale à décrocher le crochet global, fermer le fichier et quitter, cependant ConnectNamedPipe est une fonction bloquante. Quel est le moyen de déterminer quand tous les clients ont été servis pour que la boucle de service puisse se rompre?
Merci pour toute aide.
Avez-vous des suggestions quant à l'autre méthode que je peux utiliser qui ne concerne pas DllMain? – kaykun
Je ne sais pas assez sur ce que vous essayez d'accomplir avec le message envoyé sur le tuyau nommé. Quel est votre plus grand objectif avec ceci? –
L'application principale crée un fichier et définit un hook global GetMessage à l'aide de SetWindowsHookEx.Chaque processus (ou thread, je ne sais pas lequel) est injecté avec la fonction hook située dans une DLL. La fonction hook est supposée écrire dans le fichier créé dans l'application principale. Par conséquent j'ai besoin d'un moyen de passer le handle de fichier dans l'application à toutes les instances de la fonction de crochet. – kaykun