Моя цель концептуально проста: я хочу установить функцию глобального подключения GetMessage, которая использует дескриптор общего файла.Проблема возникает потому, что, насколько я понимаю, DLL, содержащая функцию ловушки, загружается несколько раз для каждого процесса, каждый со своим «адресным пространством».По этой причине меня убеждают, что я не могу просто обработать DLL_PROCESS_ATTACH DllMain для создания желаемого файла, так как несколько файлов будут создаваться с разными дескрипторами.
Решение, на которое я обратил внимание, - это Named Pipes,В основном приложение будет действовать как серверная часть;он будет один раз создавать файл, а затем предоставлять дескриптор файла клиентам 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 является функцией блокировки.Как определить, когда все клиенты были обслужены, чтобы цикл обслуживания мог прерваться?
Спасибо за любую помощь.