似乎当在DLL_PROCESS_ATTACH
上从DllMain内创建一个线程时,它将不会开始,直到所有dll都被加载。因为我需要在继续之前确保线程运行,所以我遇到了僵局。有没有办法强制线程启动?
答案 0 :(得分:10)
您不应该从DLLMain执行任何API调用,尤其是对于创建线程或窗口等内容。 Raymond Chen多次写过这篇文章;这里one特别相关。
答案 1 :(得分:5)
你的主题是做什么的?
如果你想把东西转移到第二个线程上以避免限制你在DllMain中可以做什么,那就太难了。这些不是对DllMain可以做什么的限制,它们是对DllMain运行时可以做什么的限制(并且保持加载器锁定)。如果你的线程需要加载加载器锁,它将等到第一个线程完成使用它。如果你的线程不需要加载器锁,我不明白为什么它不能立即继续......但是没有一个不需要加载器锁的线程。 Windows必须在您的线程开始运行之前向所有DLL发送DLL_THREAD_ATTACH消息,这意味着它还会调用您自己的DllMain,并且Windows可以防止重新入侵。
没有办法解决这个问题。线程无法在DLL_THREAD_ATTACH处理之后启动,并且当您的第一个线程在DllMain内时不会发生。唯一可行的方法是启动一个新进程(它有一个独立的加载器锁定,不会阻止等待你的进程)。
答案 2 :(得分:4)
没有。你不应该从DllMain调用CreateThread(或任何变种)。尝试同步将导致死锁。你究竟想做什么?
答案 3 :(得分:0)
如果你这样做,你会遇到麻烦。你不应该(直接或间接)调用你的dll之外的函数(包括C库调用等)。
如果您无法更改您拥有的DLL(例如,您没有源代码),那么如果您的DLL在其余部分之后动态加载,则可能能够侥幸成功您的依赖DLL已初始化。我不推荐这种方法,如果你可以避免它,因为找出依赖链并不总是微不足道的(例如,如果你的dll导致依赖的dll通过COM或其他方式动态加载第三个)。