钩子dll问题求解 本帖最后由 hzy694358 于 2012-11-09 11:07:27 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 把SetHook 搬到A.exe里面去无责任瞎猜 此问题其实可以归属一个,我个人的意见:假如做了一个API钩子SendTo函数,在这个函数中修改为:SendTo(){//这里做需要的事情,比如new了个窗口或什么的...//调用系统API完成功能SendTo(...)}对于问题一:这个NEW出来的东西是属于B的对于问题二:需要将钩子主动释放 有点空闲 帮你测试了下.问题一窗口 属于 调用创建窗口代码的进程如果在DllMain里面创建, 可以看到两个窗口.这个很好理解.问题二用hook的方式加载到B进程的dll的引用计数是1.在A进程关闭后 dll会被卸载, 然后B进程就会崩溃.如果是简单的解决这个问题,在B进程加载dll的时候, 调用LoadLibrary 增加dll的引用计数可以在A进程退出的时候, B进程不会崩溃.但是 hook 依然会失效, 而且窗口还在那.如果想完美的解决这个问题,只有远程注入dll到B进程,在B进程中的dll hook 在需要退出的时候,通知B进程中的dll, 让dll删除hook和窗口. 补充说明下:服务程序S 钩子程序A 钩子dll 是我处理的宿主程序是第三方软件 程序A 首先会加载 DLL,如果这个时候NEW新窗口,那么是属于A的程序A 调用SetWindowsHookEx 将DLL 加载到程序B ,如果这个时候NEW新窗口,那么是属于B的。由于NEW新窗口是在DLL中实现的,那么包括窗口过程函数和窗口资源等都是在DLL中的,此时程序B中有DLL,所以可以正常运行,估计你程序A退出的时候调用了 UnhookWindowsHookEx卸载了钩子,自然会将DLL从程序B中卸载,窗口过程函数和资源等都不在了,于是程序B崩溃。可以在程序A退出的时候不调用钩子卸载函数。 你的解释让我有点晕了钩子是由A设置的,那A进程结束钩子不是会自动卸载了吗?而B中new出来的dll中的资源,钩子不卸载岂不是还在?我想要的结果是A进程结束,B中钩子dll中的资源也正常卸载,也就是说进程A结束,B弹出的窗口关闭,同时B正常运行 所谓钩子,可以说是一段代码,遇到某个条件时执行这个代码。某个程序要执行钩子的代码,这个代码必须在这个进程内,所以使用DLL方便。设置全局钩子,系统会自动将DLL加载到进程中,这样DLL就是进程的一部分,就可以顺利的执行代码。钩子由谁设置关系不大,重要的是DLL进入了每个进程。卸载钩子,那么DLL也会退出每个进程。如果程序B new了个窗口 使用了dll的任何资源,那么在dll卸载之后,B就不能再使用这些资源,因为已经不存在了。估计你是当B的DLL卸载之后,窗口还没有退出,调用了DLL中的代码,于是报错。dll 的入口函数中判断,做相应处理就可以了。 1、A进程关闭,是不是Dll会自动从宿主进程中卸载掉呢?2、你说的做判断是怎么个判断???我用的是MFC的DLL Visual C++ 2008 Feature Pack 如何修改主框架标题的字体与颜色? 程序结束时显示内存泄露 dll能否封装模板类?(无实例化、接口方式)[老问题] VC下作ActiveX控件,内部调用Invalidate() 为什么不刷新? 关于工具栏和状态栏的使用(请各位帮帮忙) 怎样控制由AfxBeginThread启动的工作线程数 为什么我的ActiveX控件每次都要安装啊? 谁能告诉我!!! 帮我看看这个代码 如何给LPSTR,LPWSTR类型的变量付值? 在VC下自定义消息是怎么产生?不是定义,是怎么产生消息。 关于控件和变量相关联动问题(跪求高手解答)
假如做了一个API钩子SendTo函数,在这个函数中修改为:
SendTo()
{
//这里做需要的事情,比如new了个窗口或什么的
...
//调用系统API完成功能
SendTo(...)
}
对于问题一:这个NEW出来的东西是属于B的
对于问题二:需要将钩子主动释放
窗口 属于 调用创建窗口代码的进程
如果在DllMain里面创建, 可以看到两个窗口.
这个很好理解.问题二
用hook的方式加载到B进程的dll的引用计数是1.
在A进程关闭后 dll会被卸载, 然后B进程就会崩溃.如果是简单的解决这个问题,
在B进程加载dll的时候, 调用LoadLibrary 增加dll的引用计数
可以在A进程退出的时候, B进程不会崩溃.
但是 hook 依然会失效, 而且窗口还在那.如果想完美的解决这个问题,
只有远程注入dll到B进程,
在B进程中的dll hook
在需要退出的时候,
通知B进程中的dll, 让dll删除hook和窗口.
服务程序S 钩子程序A 钩子dll 是我处理的
宿主程序是第三方软件
由于NEW新窗口是在DLL中实现的,那么包括窗口过程函数和窗口资源等都是在DLL中的,此时程序B中有DLL,所以可以正常运行,估计你程序A退出的时候调用了 UnhookWindowsHookEx卸载了钩子,自然会将DLL从程序B中卸载,窗口过程函数和资源等都不在了,于是程序B崩溃。可以在程序A退出的时候不调用钩子卸载函数。
钩子是由A设置的,那A进程结束钩子不是会自动卸载了吗?
而B中new出来的dll中的资源,钩子不卸载岂不是还在?
我想要的结果是A进程结束,B中钩子dll中的资源也正常卸载,也就是说进程A结束,
B弹出的窗口关闭,同时B正常运行
卸载钩子,那么DLL也会退出每个进程。如果程序B new了个窗口 使用了dll的任何资源,那么在dll卸载之后,B就不能再使用这些资源,因为已经不存在了。估计你是当B的DLL卸载之后,窗口还没有退出,调用了DLL中的代码,于是报错。dll 的入口函数中判断,做相应处理就可以了。
1、A进程关闭,是不是Dll会自动从宿主进程中卸载掉呢?
2、你说的做判断是怎么个判断???我用的是MFC的DLL