我创建了一个钩子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吗?

解决方案 »

  1.   

    按我的理解,DLLMAIN可以作为DLL的入口出口函数,但好象不是必须的。
    而且,系统为了安全,好象会自己卸载没用的DLL 。
      

  2.   

    但是我用 FreeLibrary显式卸载,却没有调用DllMain啊
      

  3.   

    Using Load-Time Dynamic Linkingnot Using Run-Time Dynamic Linking
      

  4.   

    但是运行时连接也应该可以啊,为什么Free时没有call DllMain呢?
      

  5.   

    FreeLibrary()函数返回值表明调用成功。但写在DllMain()的DLL_PROCESS_DETACH中的MessageBox();却没有输出。用GetLastErr()也返回操作成功。不知什么原因!望哪位能够指点一下,不胜感激!
      

  6.   

    我的意思是你先测试一下把unhook时候是否调用成功以及每个程序释放该dll时候是否调用了DETACH。理论上你一旦挂上钩子,所有的有窗口的程序都会挂接你的dll,那么一旦unhook,则每个程序都会调用一次DETACH,如果没有的话,那多半你钩子已经出问题了。
    建议使用OutputDebugString来输出调试信息,MessageBox的话点过来点过去,要是在钩子中使用的,后果太难预料了,呵呵:)