我遇到一种情况,我的Windows自动启动服务应用程序显式加载并在“父” DLL1.DLL中调用启动例程(使用LoadLibrary / GetProcAddress-没有导入库)。 “父” DLL中的启动例程依次显式加载几个“子” DLL:DLL2,DLL3和DLL4。在任何DLLMain例程中都没有LoadLibrary调用。服务可执行文件和所有DLL是用C开发的。
在Windows 7上,一切正常,但是在Windows 10上,该服务在重启后随机挂在“开始挂起”中。调试输出显示它没有从父库DLL1正在加载子DLL之一的LoadLibrary返回。调试输出还显示,甚至没有调用子DLL的DLLMain例程。
所有DLLMain例程都很简单。如果ul_reason_for_call == 0,它们所做的就是InitializeCriticalSection。它们没有像在DLLMain中调用LoadLibrary那样有趣。
我已经阅读了有关Windows 10线程池的几篇文章/主题,例如this和this。
根据我的理解,Windows 10对隐式LoadLibrary的加载进行了多线程处理(即,通过导入库)。但是,它还会对显式LoadLibrary的加载进行多线程吗?例如,在子DLL3开始加载时,子DLL2可能仍在加载吗?
由于这是随机事件,因此显然必须是时间和/或线程问题。任何建议将不胜感激。我已经花了几周的时间,感到很沮丧。