即使异常终止,如何确保调用UnhookWindowsHookEx?

时间:2010-12-18 16:09:12

标签: c++ windows winapi unhookwindowshookex

不幸的是,MSDN对它不够清楚。我正在编写一个使用全局钩子的程序,我担心如果程序异常终止(崩溃,被用户杀死等)会发生什么。

  1. 当流程终止时,Windows是否会自动解除流程安装的全局挂钩?

  2. 如果没有,是否可以在另一个进程中调用UnhookWindowsHookEx()来释放钩子? (我想在钩子线程中这样做,如果它检测到安装程序进程已经死了。)

  3. 如果答案为否,则在安装程序进程终止时保持全局挂钩处于活动状态并不危险?处理这种情况的标准方法是什么?

  4. 我在MSDN中读到UnhookWindowsHookEx()没有释放在其他进程中加载​​的dll,但它没有说明什么时候会释放dll。 This article in CodeProject似乎暗示当第一条消息到达钩子线程时,dll未被映射(在相应的进程中),所以它就在UnhookWindowsHookEx()调用之后。这是真的吗?

  5. 谢谢。

2 个答案:

答案 0 :(得分:9)

  1. 是的,当一个进程终止后系统会在它之后清理 - 所有句柄都被隐式关闭。
  2. 不,它不是,反正你也不需要。
  3. (是的,不是不,不是)
  4. 我不明白为什么在这里涉及的另一个进程中加载​​了一个DLL。 (编辑:我最初想的是系统范围的钩子,例如CBTProc - 如果你的钩子是每个进程可能不同的话)如果你正在处理类似指示的链接在@Hans的评论中,你已经将自己的DLL注入到目标进程中,然后你应该放置功能来卸载DLL中的钩子,而不是将它的正确操作绑定到你的应用程序。 (即如果将消息发送回您的应用程序在DLL内部失败,那么您的DLL应该决定自行卸载) / EDIT 当DLL被加载到另一个进程中时,由该进程执行释放

答案 1 :(得分:0)

如果您的进程终止,则将隐式调用UnhookWindowsHookEx并删除钩子。收到新消息后,消息处理代码将卸载.dll。因此,一些几乎从未收到任何消息的后台进程,仍可能在删除钩子后很长时间就锁定了库。广播WM_NULL消息通常会有所帮助。我喜欢在摘钩后发送几次。

SendNotifyMessage(HWND_BROADCAST, WM_NULL, 0, 0);