如题,我设置了一个全局的钩子(键盘钩子),钩子函数在dll里面;然后我再钩子函数里面创建了一个线程。
那么这个线程的生命周期是怎么样的?
我实验的结果貌似是小于等于主线程的周期,不明白为什么。
全局钩子的dll不是要被映射到所有进程的地址空间里面吗,我在其他进程的窗口里面按一个键,会调用钩子函数
执行线程,这时线程应该是在我按下键的那个窗口所属的进程地址空间里执行的吧,就算这时钩子被卸载了,应该
也不会影响线程的执行啊,难道钩子被卸载以后,系统还会从所有进程的地址里面自动卸载钩子所在的模块?搞不明白,谁能解释下吗?

解决方案 »

  1.   

    网上找来了下:设置了全局钩子以后,系统并不是马上把dll映射到所有进程空间,而是等待动作触发这个钩子函数,然后再把dll映射到发生触发动作的进程里面,不是触发的进程也不映射;完了等钩子函数卸载,或者设置钩子函数的进程结束时,系统自动取消钩子,然后再卸载钩子所在的dll。如果不想让钩子所在的模块在钩子卸载以后被卸载,可以在系统被触发,要向进程空间映射dll的时候,用loadlibrary()再次加载dll,或者你感兴趣的dll,这样钩子在卸载以后,所在模块就不会被在卸载了。