Может быть вы писали глобальные хуки под Win32 c помощью SetWindowsHookEx(). Тогда вам знакома ситуация, когда выше приложение закончило работать, оно удалило хук, и вы, поправив код, пытаетесь пересобрать DLL, но линкер вам говорит: HOOK.DLL: Cannot open file for writing. Оказывается, DLL хука осталась загруженной в некоторых процессах. Что делать? Обычно люди просто переименовывают файл DLL, и линкер успешно создаёт новый. Но после нескольких таких переименований могут начаются глюки и придется перелогиниться.
Сегодня я вдруг понял проблему
Выгрузка хуков происходит внутри GetMessage. Некоторые процессы не получают никаких сообщений часами, соответственно, GetMessage у них не вызывается. Решение — послать окнам этих процессов хоть что-нибудь с помощью PostMessage.
Вот например, решение на питоне — посылает какому-нибудь окну каждого из процессов WM_NULL. После запуска этого скрипта все невыгруженные DLL с хуками выгружаются. Требует ActivePython, но вы можете легко переписать это на C++.
# Post WM_NULL to some window of every process in current desktop.
# This helps to unload hook DLL when hook has been removed, but DLL stays loaded into some processes.
import win32gui, win32process, win32api
# Find all top-level windows
def MyEnumWindows():
lst = []
win32gui.EnumWindows( (lambda hwnd, lparam: lst.append( hwnd ) and True), 0 )
return lst
windows = MyEnumWindows()
# Select one window from each unique process
pid_hwnd_pairs = [(win32process.GetWindowThreadProcessId( hwnd )[1], hwnd) for hwnd in windows]
windows = dict(pid_hwnd_pairs).values()
# Post WM_NULL to each
for hwnd in windows:
print "Posting to 0x%08X" % hwnd
win32api.PostMessage( hwnd, 0, 0, 0 )
# Now your hook dlls must be unloaded.
Здравствуйте, Кодёнок, Вы писали:
Хотя если подумать, достаточно лишь
import win32gui, win32api
win32gui.EnumWindows( (lambda hwnd, lparam: win32api.PostMessage( hwnd, 0, 0, 0 ) and True ), 0 )
Здравствуйте, Abandoned, Вы писали:
A>баян :
A>Re: деинсталляция hook dllАвтор: Вумудщзук
Дата: 17.03.06
Ясно, я проморгал