美文网首页
dllmain中奇葩行为之一二

dllmain中奇葩行为之一二

作者: 赵海洋 | 来源:发表于2018-09-27 16:24 被阅读0次

    某项目中需要将一个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来启动线程,问题得以解决。

    相关文章

      网友评论

          本文标题:dllmain中奇葩行为之一二

          本文链接:https://www.haomeiwen.com/subject/ewgeoftx.html