Как я могу гарантировать, что UnhookWindowsHookEx вызывается даже после аварийного завершения?
К сожалению, MSDN не достаточно ясно с этим. Я пишу программу, которая использует глобальный хук, и я беспокоюсь о том, что произойдет, если программа будет аварийно завершена (сбои, убитые пользователем и т. Д.).
Windows автоматически отцепляет глобальные хуки, установленные процессом, когда процесс завершается?
Если нет, возможно ли вызвать UnhookWindowsHookEx() в другом процессе, чтобы освободить ловушку? (Я думаю сделать это в подключенном потоке, если он обнаружит, что процесс установки мертв.)
Если ответы были "нет" и "нет", не опасно ли оставлять глобальный хук активным после завершения процесса установки? Каковы стандартные методы решения этой ситуации?
Я прочитал в MSDN, что UnhookWindowsHookEx() не освобождает dll, загруженную в другие процессы, но не говорит, когда будет освобождена dll. Эта статья в CodeProject, по- видимому, предполагает, что dll не отображается (в соответствующем процессе), когда первое сообщение поступает в перехваченный поток, так что это примерно сразу после вызова UnhookWindowsHookEx(). Это правда?
Спасибо.
2 ответа
- Да, когда процесс завершается, система очищается после него - все дескрипторы неявно закрываются.
- Нет, это не так, и вам все равно это не нужно.
- (Это да и нет не нет и нет)
- Я не понимаю, почему DLL загружается в другой процесс, участвующий здесь. (РЕДАКТИРОВАТЬ: я изначально думал о системной ловушке, такой как CBTProc - если ваша ловушка связана с процессом, который может отличаться) Если вы имеете дело с чем-то вроде ссылки, указанной в комментарии @Hans, посредством чего вы ввели свою собственную DLL в целевой процесс, тогда вы должны добавить функциональность, чтобы выгрузить хук внутри вашей DLL, а не привязывать ее правильную работу к вашему приложению. (То есть, если отправка сообщения обратно в ваше приложение не выполняется внутри DLL, тогда ваша DLL должна решить самостоятельно ее разгрузить) / РЕДАКТИРОВАТЬ Когда DLL загружается внутри другого процесса, этот процесс должен выполнить освобождение.
Если ваш процесс умирает, UnhookWindowsHookEx вызывается неявно, и ваши хуки удаляются..Dll выгружается кодом обработки сообщений после получения нового сообщения. Поэтому некоторые фоновые процессы, которые почти никогда не получают никаких сообщений, могут все еще держать библиотеку заблокированной еще долго после того, как ваш хук был удален. Трансляция сообщения WM_NULL обычно помогает. Мне нравится отправлять его несколько раз после отсоединения.
SendNotifyMessage(HWND_BROADCAST, WM_NULL, 0, 0);