Моя цель концептуально проста: я хочу установить глобальную функцию GetMessage, использующую общий дескриптор файла. Проблема возникает из-за того, что, насколько мне известно, DLL, содержащая функцию hook, загружается несколько раз для каждого процесса, каждый со своим «адресным пространством». По этой причине я убежден, что не могу просто обработать DLL_PROCESS_ATTACH DllMain для создания нужного файла, так как будет создано несколько файлов с разными дескрипторами.Приложение к Global Hook DLL
Решение, которое было доведено до моего сведения, это именованные трубы. В основном приложение будет действовать как конец сервера; он однажды создаст файл, а затем предоставит дескриптор файла для DLL-клиентов, поэтому каждый глобальный крючок будет использовать тот же файл.
Я не могу заставить его работать с кодом, который я собрал. В приложении я создаю файл, установить глобальную функцию крюка, а затем сделать его пройти через эту петлю:
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);
}
Тогда я обрабатывать DLL_PROCESS_ATTACH в DllMain как так:
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;
}
Проще говоря, это не работает, и я не могу понять, почему. Есть ли что-то, что мне не хватает или что-то не так в моем коде?
Другая проблема, которую я не могу понять, заключается в том, что приложение застряло в бесконечном цикле постоянной подачи. Я хочу настроить событие, которое DLL установит при определенных обстоятельствах, и заставить основное приложение отменить глобальный крючок, закрыть файл и выйти, однако ConnectNamedPipe является функцией блокировки. Каким образом можно определить, когда все клиенты были обслужины, чтобы обслуживающий цикл мог нарушиться?
Спасибо за любую помощь.
Есть ли у вас какие-либо предложения относительно того, какой другой метод я могу использовать, который не связан с DllMain? – kaykun
Я не знаю достаточно о том, что вы пытаетесь выполнить с сообщением, отправленным по именованному каналу. Какова ваша общая цель? –
Основное приложение создает файл и устанавливает глобальный крючок GetMessage, используя SetWindowsHookEx.Каждый процесс (или поток, я честно не знаю, который) вводится с помощью функции hook, расположенной в DLL. Предполагается, что функция hook используется для записи в файл, который был создан в основном приложении. Поэтому мне нужно каким-то образом передать дескриптор файла в приложении ко всем экземплярам функции hook. – kaykun