关于全局钩子dll卸载的疑惑

jruv 2003-08-25 01:28:46
我创建了一个钩子dll,有钩子函数,安装/卸载钩子函数。
在我的exe程序中安装钩子(LoadLibrary(...),InstallHook(...)),
然后卸载钩子(UnInstallHook(...),FreeLibrary(...))时产生了问题:

1.当我的钩子是 WH_KEYBOARD时,卸载时能正确调用DllMain中DLL_PROCESS_DETACH
2.当钩子是WH_CBT时,FreeLibrary返回成功,但却没有调用DllMain中的DLL_PROCESS_DETACH,但我的exe程序结束,才调用了DllMain(),这时dll已经被我卸载掉了。

请问诸位高人,这是怎么回事,FreeLibrary时不一定调用DllMain吗?
...全文
302 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
jruv 2003-08-27
  • 打赏
  • 举报
回复
但是运行时连接也应该可以啊,为什么Free时没有call DllMain呢?
jruv 2003-08-27
  • 打赏
  • 举报
回复
不错,接受你的意见!
farfh 2003-08-27
  • 打赏
  • 举报
回复
我的意思是你先测试一下把unhook时候是否调用成功以及每个程序释放该dll时候是否调用了DETACH。理论上你一旦挂上钩子,所有的有窗口的程序都会挂接你的dll,那么一旦unhook,则每个程序都会调用一次DETACH,如果没有的话,那多半你钩子已经出问题了。
建议使用OutputDebugString来输出调试信息,MessageBox的话点过来点过去,要是在钩子中使用的,后果太难预料了,呵呵:)
jruv 2003-08-27
  • 打赏
  • 举报
回复
FreeLibrary()函数返回值表明调用成功。但写在DllMain()的DLL_PROCESS_DETACH中的MessageBox();却没有输出。用GetLastErr()也返回操作成功。不知什么原因!望哪位能够指点一下,不胜感激!
farfh 2003-08-27
  • 打赏
  • 举报
回复
应该会才对,我用除非你没把钩子挂上去,或者已经出错了。
建议你用一些输出函数查看一下。
yanzai8848 2003-08-26
  • 打赏
  • 举报
回复
Using Load-Time Dynamic Linking

not Using Run-Time Dynamic Linking
jruv 2003-08-25
  • 打赏
  • 举报
回复
但是我用 FreeLibrary显式卸载,却没有调用DllMain啊
crushor 2003-08-25
  • 打赏
  • 举报
回复
按我的理解,DLLMAIN可以作为DLL的入口出口函数,但好象不是必须的。
而且,系统为了安全,好象会自己卸载没用的DLL 。
jruv 2003-08-25
  • 打赏
  • 举报
回复
没有人知道吗,大家探讨一下嘛!

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧