我有一个使用 html 帮助用 Delphi 2007 编写的程序。它经常在退出时挂起(即使实际上并未调用 html 帮助),我将问题追溯到 Windows.pas 的最终部分中的此调用
finalization
if HtmlHelpModule <> 0 then FreeLibrary(HtmlHelpModule);
end.
由于在 hhctrl.ocx 的卸载代码深处存在 NTWaitFormMultipleObjects,主线程在此调用中挂起。还有其他线程(我的代码都没有创建)显然等待相同,所以我的程序挂起。我猜其中一些线程是由 ADO 和/或 Microsoft SQL Server 客户端库创建的。
我找到了一种解决方法:对 LoadLibrary('hhctrl.ocx') 的附加调用,因此在 Windows.pas 中对 FreeLibrary 的调用实际上并没有卸载 dll,而只是将引用计数减少到 1。虽然这似乎有效,但确实如此不是感觉不对。
这是一个已知问题吗?有合适的解决方案吗?
(是的,我用谷歌搜索,但没有发现任何帮助。这似乎描述了一个类似的问题 https://social.msdn.microsoft.com/Forums/en-US/7bce34a2-50a0-411d-872f-0626360d5415/dll-sometimes -hangs-on-unload?forum=vcgeneral 使用不同的 DLL。)
编辑:更多信息:
该问题显然仅在程序中从未调用过 html 帮助时才会出现(因此未调用 LoadLibrary('hhctl.ocx'))。关闭时,htmlhelp.pas 中的最终代码会尝试关闭所有 htmlhelp 查看器窗口(其中没有),并首次调用 HtmlHelp 函数。这会导致调用 windows.pas 中的 LoadLibrary。如果我在程序中显示任何 htmlhelp,一切正常。所以,我认为这可能是在 RTL 的最终确定中调用 LoadLibrary('hhctl.ocx') 的问题。但我不知道如何避免这种情况。