有一个DLL,由主(桌面)应用程序通过
Windows.LoadLibrary动态加载.那是因为有很多类似的DLL,并且只需要在运行时加载很少的单个DLL.因此静态链接不是一种选择.
问题是,在加载其中一个DLL时,主应用程序每隔一段时间就会挂起.请注意,问题很可能发生在每一个问题上.可能是因为他们有很多共同的代码库.
问题似乎是装载机锁(see this SO answer on what it is).我发现了一个公共代码,它在启动时在库单元的开始…结束部分(即project.dpr)中使用,其中使用了GetModuleHandle和GetProcAddress.
我发现,这是一个完全没有DLL的东西,因为DLL的项目文件的开始…结束部分实际上是库的DllMain函数,并且调用这些函数可能导致死锁(命名加载器锁).我在Microsoft Best Practice Guide年读过这篇文章.
所以我重建了我的代码,当Windows.LoadLibrary的调用完成后,稍后会调用这些调用.
不幸的是,悬挂问题仍然存在. 原文链接:https://www.f2er.com/delphi/239252.html