我们有一个复杂的Delphi应用程序,其中包含一个主exe和几个dll。 在主要形式(包含在应用程序exe中)中,我们具有菜单栏。 选择菜单后,将加载相应的dll,并以模态形式显示该dll中包含的表格。
情况如下:
在源代码中,我们有:
result := FreeLibrary(MH);
整个应用程序崩溃,并出现以下Windows错误:
ERROR_ALLOCATE_BUCKET
602 (0x25A)
The bucket array must be grown. Retry transaction after doing so.
如果我们先关闭上下文帮助,然后关闭模式形式,一切都会好的。
最奇怪的是,我们有3个dll崩溃了,而3个没有崩溃。 流程通过相同的代码。
Windows事件日志中没有任何内容。
我认为作为一种解决方法,我可以在卸载dll之前强制关闭有关模式形式的上下文帮助,但是找不到pid或某些可以杀死的任务标识符。 没有应用程序pid的子进程。
在任务管理器的“进程”选项卡中,我看到了我们的应用程序名称和chm文件的名称(没有.chm),就像子任务一样(至少看起来像这样),我可以右键单击“停止任务”,但是以编程方式我找不到这个...
PS: 我们使用.chm文件,并且在任何模块的使用中都没有HtmlHelpViewer。 我们已将特定的帮助主题与表单中的控件相关联,因此当用户将其聚焦并按F1时,它们会自动显示相应的帮助主题。因此,实际上我们不使用Application.HelpCommand(.....)来显示帮助
****编辑****
当前,我们使用Delphi Tokyo。该产品于15年前在Delphi7中推出。它有几个dll-s(其中一些是额外的产品模块),具有许多格式和框架。
****编辑****
**LU RD's answer solved my problem:**
Application.HelpCommand(HELP_QUIT, 0);
P.S: 我不能将答案标记为已接受。我不知道为什么。
答案 0 :(得分:3)
“我认为作为一种解决方法,我可以在卸载dll之前强制关闭关闭模态表单的上下文帮助,但是找不到pid或某些可以杀死的任务标识符。没有子代pid的应用程序进程。”
为了关闭上下文帮助,请以模式形式OnClose()
事件添加此行:
Application.HelpCommand(HELP_QUIT, 0);
Application.HelpCommand::提供对本机帮助处理功能HTMLHelp,WinHelp或其他功能的应用程序编程接口(API)中的任何帮助命令的访问。
有关更多详细信息,请参见Vcl.Forms.TApplication.HelpCommand。