某项目中需要将一个dll Hook进资源管理器,然后在dll入口(也就是dllmain)里获取当前任务栏的状态,里面先用了GetClassName来获取窗口类名,然后再调用了GetWindowTextLength来获取任务栏里子窗口的标题。
但这个场景先后发现了二处以前未遇到的问题:
问题一
在某台win7 32位的机器上,如果是重启资源管理器时加载了dll,在dllmain里调用GetWindowTextLength卡住,原因不明(那台机器不能开启远程调试,所以也没有看堆栈卡在哪儿了)
问题二
然后就尝试了将相关操作使用线程封装的方法,先采用了std::thread,结果在创建线程的地方就卡住了,std::thread的构造函数不能结束。查看堆栈和代码发现,std::thread在构造时需要等待新线程启动后才返回,但新建的线程一直未能启动,似乎在等待某个内核对象,而这个内核对象可能又在dllmain所在线程中已锁定。
image.png
后来也在stackoverflow下搜索到了下面这条同样的问题
https://stackoverflow.com/questions/32252143/stdthread-cause-deadlock-in-dllmain
最终解决办法就是换用了_beginthreadex来启动线程,问题得以解决。
网友评论