html ヘルプを使用する Delphi 2007 で書かれたプログラムがあります。非常に頻繁に終了時にハングアップし (実際には html ヘルプが呼び出されていなくても)、Windows.pas のファイナライズ セクションでこの呼び出しまで問題を突き止めました。
finalization
if HtmlHelpModule <> 0 then FreeLibrary(HtmlHelpModule);
end.
hhctrl.ocx のアンロード コードの奥深くにある NTWaitFormMultipleObjects が原因で、この呼び出しでメイン スレッドがハングします。明らかに同じものを待機している他のスレッド (私のコードが作成するスレッドはありません) があるため、プログラムがハングします。これらのスレッドのいくつかは、ADO や Microsoft SQL Server クライアント ライブラリによって作成されていると思います。
私は 1 つの回避策を見つけました: LoadLibrary('hhctrl.ocx') への追加の呼び出しなので、Windows.pas の FreeLibrary への呼び出しは実際には dll をアンロードせず、参照カウントを 1 に減らすだけです。気分が悪いわけではありません。
これは既知の問題ですか? 適切な解決策はありますか?
(はい、私はグーグルで検索しましたが、役立つものは何も見つかりませんでした。これは同様の問題を説明しているよう です-hangs-on-unload?forum=vcgeneral と別の DLL を使用します。)
編集:いくつかの詳細情報:
この問題は、プログラム内で html ヘルプがまったく呼び出されない場合 (つまり、LoadLibrary('hhctl.ocx') が呼び出されなかった場合) にのみ発生するようです。シャットダウン時に、htmlhelp.pas のファイナライズ コードは、すべての htmlhelp ビューアー ウィンドウ (ウィンドウがないもの) を閉じようとし、HtmlHelp 関数への最初の呼び出しを発行します。これにより、windows.pas で LoadLibrary が呼び出されます。プログラムで htmlhelp を表示すると、すべて正常に動作します。したがって、これは RTL のファイナライズ内で LoadLibrary('hhctl.ocx') を呼び出す際の問題である可能性があると思います。しかし、これを回避する方法がわかりません。