Хорошо, во-первых, вы слишком много делаете в своей функции точки входа dll. С одной стороны - и это прямо из MSDN - «Существуют серьезные ограничения на то, что вы можете делать в точке входа DLL». Кроме того, в то время как в точке входа dll блокировка загрузчика удерживается, поэтому другие библиотеки не могут быть загружены / выгружены. Итак, когда вы выполняете цикл обработки сообщений (вызывая InstallHook () ) в точке входа DLL, вы действительно бросаете палку в велосипедные спицы, так что говорите.
Теперь, когда это не так, заставить его работать довольно просто. Когда DLL будет загружена, создайте новый поток по адресу InstallHook , и все будет хорошо. Теперь ваш цикл обработки сообщений будет находиться в отдельном потоке с собственной очередью сообщений (или, по крайней мере, так и должно быть, обмен сообщениями в Windows все еще смущает меня).
case DLL_PROCESS_ATTACH:
CreateThread( NULL, 0, (LPTHREAD_START_ROUTINE)InstallHook, (void*)NULL, 0, NULL );