本帖最后由 hzy694358 于 2012-11-09 11:07:27 编辑

解决方案 »

  1.   

    把SetHook 搬到A.exe里面去无责任瞎猜
      

  2.   

    此问题其实可以归属一个,我个人的意见:
    假如做了一个API钩子SendTo函数,在这个函数中修改为:
    SendTo()
    {
    //这里做需要的事情,比如new了个窗口或什么的
    ...
    //调用系统API完成功能
    SendTo(...)
    }
    对于问题一:这个NEW出来的东西是属于B的
    对于问题二:需要将钩子主动释放
      

  3.   

    有点空闲 帮你测试了下.问题一
    窗口 属于 调用创建窗口代码的进程
    如果在DllMain里面创建, 可以看到两个窗口.
    这个很好理解.问题二
    用hook的方式加载到B进程的dll的引用计数是1.
    在A进程关闭后 dll会被卸载, 然后B进程就会崩溃.如果是简单的解决这个问题,
    在B进程加载dll的时候, 调用LoadLibrary 增加dll的引用计数
    可以在A进程退出的时候, B进程不会崩溃.
    但是 hook 依然会失效, 而且窗口还在那.如果想完美的解决这个问题,
    只有远程注入dll到B进程,
    在B进程中的dll hook 
    在需要退出的时候,
    通知B进程中的dll, 让dll删除hook和窗口.
      

  4.   

    补充说明下:
    服务程序S 钩子程序A 钩子dll 是我处理的
    宿主程序是第三方软件
      

  5.   

    程序A 首先会加载 DLL,如果这个时候NEW新窗口,那么是属于A的程序A 调用SetWindowsHookEx 将DLL 加载到程序B ,如果这个时候NEW新窗口,那么是属于B的。
    由于NEW新窗口是在DLL中实现的,那么包括窗口过程函数和窗口资源等都是在DLL中的,此时程序B中有DLL,所以可以正常运行,估计你程序A退出的时候调用了 UnhookWindowsHookEx卸载了钩子,自然会将DLL从程序B中卸载,窗口过程函数和资源等都不在了,于是程序B崩溃。可以在程序A退出的时候不调用钩子卸载函数。
      

  6.   

    你的解释让我有点晕了
    钩子是由A设置的,那A进程结束钩子不是会自动卸载了吗?
    而B中new出来的dll中的资源,钩子不卸载岂不是还在?
    我想要的结果是A进程结束,B中钩子dll中的资源也正常卸载,也就是说进程A结束,
    B弹出的窗口关闭,同时B正常运行
      

  7.   

    所谓钩子,可以说是一段代码,遇到某个条件时执行这个代码。某个程序要执行钩子的代码,这个代码必须在这个进程内,所以使用DLL方便。设置全局钩子,系统会自动将DLL加载到进程中,这样DLL就是进程的一部分,就可以顺利的执行代码。钩子由谁设置关系不大,重要的是DLL进入了每个进程。
    卸载钩子,那么DLL也会退出每个进程。如果程序B new了个窗口 使用了dll的任何资源,那么在dll卸载之后,B就不能再使用这些资源,因为已经不存在了。估计你是当B的DLL卸载之后,窗口还没有退出,调用了DLL中的代码,于是报错。dll 的入口函数中判断,做相应处理就可以了。
      

  8.   


    1、A进程关闭,是不是Dll会自动从宿主进程中卸载掉呢?
    2、你说的做判断是怎么个判断???我用的是MFC的DLL