Veg*_*sen 4 winapi setwindowshookex unhookwindowshookex
当加载它们的系统范围的钩子被卸载时,如何从所有进程正确卸载 DLL?
从MSDN:
您可以使用 UnhookWindowsHookEx 释放全局钩子过程,但该函数不会释放包含钩子过程的 DLL。这是因为在桌面中每个应用程序的进程上下文中调用全局钩子过程,导致对所有这些进程的 LoadLibrary 函数的隐式调用。因为不能为另一个进程调用 FreeLibrary 函数,所以没有办法释放 DLL。在显式链接到 DLL 的所有进程都已终止或调用 FreeLibrary 并且调用挂钩过程的所有进程已在 DLL 外部恢复处理后,系统最终会释放 DLL。
所以我在寻找的是一种检测钩子何时解钩的方法,然后FreeLibrary
从所有被钩子的进程中调用。有没有其他方法可以在卸载钩子时立即卸载 DLL?
Hook dll 在它们的消息循环中被卸载。强制它们传入消息循环有助于卸载它们。
在您的 UnhookWindowsHookEx 之后添加此内容以强制所有消息循环唤醒:
DWORD dwResult;
SendMessageTimeout(HWND_BROADCAST, WM_NULL, 0, 0, SMTO_ABORTIFHUNG|SMTO_NOTIMEOUTIFNOTHUNG, 1000, &dwResult);
Run Code Online (Sandbox Code Playgroud)
但是,我仍然不时遇到问题。我不知道它来自哪里。我想锁定的进程可能会阻止 dll 卸载,但我没有证据证明这一点。