当加载 DLL 的系统范围挂钩被卸载时,如何从所有进程中正确卸载 DLL?
From MSDN:
您可以释放全局钩子
程序通过使用
取消挂钩WindowsHookEx,但这个功能
不释放包含以下内容的 DLL
钩子程序。这是因为全球
钩子过程被调用在
每个应用程序的进程上下文
在桌面上,导致隐式
调用 LoadLibrary 函数
所有这些过程。因为一个电话
FreeLibrary 函数不能
为另一个进程制作的,有
那么就没有办法释放DLL了。这
系统最终释放DLL
所有进程明确链接到
DLL 已终止或调用
FreeLibrary 和所有进程
调用的钩子程序已恢复
在 DLL 外部进行处理。
所以我正在寻找的是一种检测钩子何时脱钩的方法,然后调用FreeLibrary
来自所有被挂钩的进程。有没有其他方法可以在卸载钩子时立即卸载 DLL?
Hook dll 在其消息循环中卸载。强制它们传入消息循环有助于卸载它们。
在 UnhookWindowsHookEx 之后添加以下内容以强制唤醒所有消息循环:
DWORD dwResult;
SendMessageTimeout(HWND_BROADCAST, WM_NULL, 0, 0, SMTO_ABORTIFHUNG|SMTO_NOTIMEOUTIFNOTHUNG, 1000, &dwResult);
但是我仍然时不时地遇到这个问题。我不知道它是从哪里来的。我认为锁定的进程可能会阻止 dll 卸载,但我没有证据证明这一点。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)