Доброго времени суток.
Коллеги, подскажите pls каким образом обычно решается следующая проблема. Есть некое приложение, которое использует хуки — например "хучит мышь". Пользователь поигрался с программой, а потом решил её деинсталлировать. Удалить hook.dll не всегда представляется возможным, т.к. она может быть загружена в адресное пространство другого процесса и использоваться. Однако оставлять компонент деинсталлированной программы имхо не есть гут. Как штатно обходится эта неприятность ?
Почему добро всегда побеждает зло? Потому что историю пишут победители.
Здравствуйте, Vovik1982, Вы писали:
V>При выходе из программы ты должен снимать все хуки и освобождать библиотеку.
Этого недостаточно. Если загружено стороннее приложение, dll убить невозможно. Выход — это ребут / логаут, а при входе в систему стереть компонент. Но может чего-нибудь поизящнее существует в мире стандартных решений ...
Почему добро всегда побеждает зло? Потому что историю пишут победители.
Здравствуйте, Amethyst, Вы писали:
A>Этого недостаточно. Если загружено стороннее приложение, dll убить невозможно. Выход — это ребут / логаут, а при входе в систему стереть компонент. Но может чего-нибудь поизящнее существует в мире стандартных решений ...
Так и делай ИМХО. Причем MoveFileEx тебе в помощь.
It is always bad to give advices, but you will be never forgiven for a good one.
Oscar Wilde
>Коллеги, подскажите pls каким образом обычно решается следующая проблема. Есть некое приложение, которое использует хуки — например "хучит мышь". Пользователь поигрался с программой, а потом решил её деинсталлировать. Удалить hook.dll не всегда представляется возможным, т.к. она может быть загружена в адресное пространство другого процесса и использоваться. Однако оставлять компонент деинсталлированной программы имхо не есть гут. Как штатно обходится эта неприятность ?
Хуковая dll загружается в процесс тогда, когда процесс (не совсем точно... видимо, когда любой из потов процесса) получает сообщение в очередь. Аналогично dll'ка выгружается, когда в приходит сообщение, а система обнаруживает, что хук снят. Так что если процесс висит в бэкграунде и не получает сообщений, dll'ка будет болтаться в его адресном пространстве. А чтобы форсировать выгрузку можно попробовать после снятия хука послать всем приложениям какое-нть сообщение, например WM_NULL:
Но есть одно НО. Если процесс, в котором сидит Хук, заснул на функции аля WaitForSingleObject, то сколько не посылай сообщений, то он (процесс), его не обработает, и хук будет оставаться в этом процессе.
Варианты решения есть типа, заставить это процесс вызвать функцию PeekMessage, причем это можно это сделать из другого потока, данного процесса. Достигнуть такого эффекта можно или внедрения своего кода в это процесс с помощью CreateRemoteThread или, сам хук должен создавать поток и ждать сигнала, что бы вызвать PeekMessage.