不幸的是,MSDN 对此还不够清楚。我正在编写一个使用全局钩子的程序,我担心如果程序异常终止(崩溃、被用户杀死等)会发生什么。
当进程终止时,Windows 是否会自动取消进程安装的全局挂钩?
如果没有,是否可以在另一个进程中调用UnhookWindowsHookEx()来释放钩子? (如果检测到安装程序进程已终止,我正在考虑在挂钩线程中执行此操作。)
如果答案是否定的,那么当安装程序进程终止时让全局挂钩保持活动状态不是很危险吗?处理这种情况的标准方法是什么?
我在MSDN中读到UnhookWindowsHookEx()不会释放其他进程中加载的dll,但它没有说何时释放该dll。CodeProject 中的这篇文章 http://www.codeproject.com/KB/threads/winspy.aspx似乎表明当第一条消息到达被挂钩的线程时,dll 被取消映射(在相应的进程中),因此大约在 UnhookWindowsHookEx() 调用之后。这是真的吗?
谢谢。
- 是的,当一个进程终止时,系统会在它之后进行清理——所有句柄都会隐式关闭。
- 不,不是,而且你也不需要这么做。
- (是是和不是,不是不是和否)
- 我不明白为什么这里涉及到另一个进程中加载了一个 DLL。 (EDIT:我最初想到的是一个系统范围的钩子,例如CBTProc http://msdn.microsoft.com/en-us/library/ms644977.aspx-- 如果您的钩子是针对每个进程的,则可能会有所不同)如果您正在处理类似 @Hans 注释中指示的链接的内容,您已将自己的 DLL 注入到目标进程中,那么您应该将功能添加到卸载 DLL 内的挂钩,而不是将其正确操作绑定到您的应用程序。 (即,如果在 DLL 内将消息发送回您的应用程序失败,则您的 DLL 应决定自行卸载)/EDIT当 DLL 被加载到另一个进程中时,由该进程来进行释放。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)