单击 Url 或打印按钮时,chm 文件会冻结应用程序
Chm file freeze the application when Url or Print buttons were clicked
当我从 Windows Forms 应用程序打开帮助文件时,我正在使用此代码。
public static void ShowHelp(string constant)
{
Help.ShowHelp(dummyFormForHelp.Value, CHMFile, HelpNavigator.Topic, constant);
}
除了我在帮助文件中单击 GO>URL... 或 Print 按钮时,它工作正常。
[
我没有收到消息,应用程序和 chm 文件根本没有响应。我需要去任务管理器并终止进程。我不知道它是什么。
我尝试使用来自只有一个表单的简单 Windows 表单应用程序的相同代码打开同一个文件,一切都很完美。所以我认为我的申请有问题。
什么会导致这样的问题?
这是一个有很多屏幕的大型企业应用程序。
打开CHM的代码片段好像不太干净(??? dummyFormForHelp.Value
, constant
)。 Help.ShowHelp()
就像是对 HTMLHelp API 调用的包装(另请参阅:HTMLHelp API - VBA, VB6 und VB2003)。参数有点死板
再想一想 - 请阅读 HTMLHelp API - HH_CLOSE ALL Note 并交叉检查您的代码。由于 HH API 中的错误,请确保您在主窗体的 Query_Unload 事件中调用它而不是 OnClose。
请使用正确的参数调用 Help.ShowHelp()
函数,如下所示。
Help.ShowHelp(this, CHMFile, HelpNavigator.Topic, "foobar.htm");
从上面的示例应用程序屏幕截图来看,以下所有代码都适用于我。请尝试您的需求。打开 URL 在这里很特别,而不是您的屏幕截图中显示的那个 (URL ...)。
#region mnuHelp ---------------------------------------------
private void mnuHelpContents_Click(object sender, EventArgs e)
{
//--- Show contents of help file.
Help.ShowHelp(this, helpProviderMain.HelpNamespace);
}
private void mnuHelpIndex_Click(object sender, EventArgs e)
{
//--- Show index of help file.
Help.ShowHelpIndex(this, helpProviderMain.HelpNamespace);
}
private void mnuHelpSearch_Click(object sender, EventArgs e)
{
//--- Show search tab of help file.
Help.ShowHelp(this, helpProviderMain.HelpNamespace, HelpNavigator.Find);
}
private void mnuHelpTest_Click(object sender, EventArgs e)
{
//--- Show a web site with help content.
Help.ShowHelp(this, "http://www.whosebug.com");
}
private void mnuHelpOpenTopicByName_Click(object sender, EventArgs e)
{
//--- Open topic by name.
Help.ShowHelp(this, helpProviderMain.HelpNamespace, HelpNavigator.Topic, "Garden/tree.htm");
}
private void mnuHelpOpenTopicById_Click(object sender, EventArgs e)
{
//--- Open topic by ID.
Help.ShowHelp(this, helpProviderMain.HelpNamespace, HelpNavigator.TopicId, "20010");
}
#endregion -----------------------------------------------
编辑:
下载并 运行 我们的 MJ's Diagnostics 工具。
MJ 的诊断程序是一个小型实用程序,它会报告所有 HTML 帮助 运行time & Workshop(编译器)DLL 是否已安装并注册到正确的位置。如果您遇到编译器崩溃,并且在打开 CHM 或从 CHM 搜索选项卡搜索时崩溃,那么此实用程序将帮助解决 rouge DLL 问题。
首先问题描述的不是很清楚:
- 值得一提的是,chm 文件是由 NuHelp 生成的(这是临时解决方案,但我们都知道临时永远是永久性的,对吧?))
dummyFormForHelp.Value
在这里什么也没说,它只是延迟初始化的表单实例,以防止帮助 window 的最顶层位置并允许在应用程序和帮助 之间切换
dummyFormForHelp.Value
表示:
private static readonly Lazy<Form> dummyFormForHelp = new Lazy<Form>(() =>
{
var form = new Form();
form.CreateControl();
return form;
});
返回 WinForms<>CHM 帮助的原始问题:
- 只有在应用程序打开帮助时才会出现问题,如果直接打开帮助 - 完全没有问题
- 当导航至 URL、在“搜索”选项卡中打印或键入任何世界时,100% 陷入无限循环
研究表明您的应用程序冻结和打开的 chm 问题不是唯一的:
- Bug in some versions of Windows
- Issues with CHM generated by RoboHelp
- 关于连接的主题 Help.ShowHelp hangs in endless loop on Windows 10 和惊人的答案:不幸的是,这是 Windows 帮助系统的问题,而不是 Windows 表单。拥有帮助系统的团队目前不接受连接反馈,因此我们不能将此作为连接问题处理。感谢您的报告。
- 带有挂起的堆栈示例 here
解决方案
解决问题的方法:
- 尝试 NuHelp
的最新版本
- 尝试不同的转换器并检查是否有帮助
- 不使用任何转换器,自行生成帮助文件
- 作为不同的进程启动帮助
作为不同的进程启动帮助:
hh 添加到 windows 路径,因此可以轻松执行此类命令:
hh "help.chm::/topic.html"
hh "help.chm::/topic.html#subtopic"
hh -mapid 12345 help.chm
解决方法的缺点:应用程序每次调用帮助都会打开新的帮助实例。
编辑:2017 年 8 月 28 日
对于未来的读者:
- 不同常用转换器的重新编译没有帮助
- 使用帮助和手册重新创建了帮助,
- 索引已返回,关键字配置正确,搜索已返回
- 使用了
hh
的调用
现在帮助按预期工作。
这是 Windows 10 的一个错误,已在 Windows 10、v1607/build 14393 中修复。
它至少出现在 Windows 10、v1507/build 10240 和 v1511/build 10586 中。
(我已经为该主题创建了一个 Connect issue,但不幸的是,该站点已无法访问。)
当我从 Windows Forms 应用程序打开帮助文件时,我正在使用此代码。
public static void ShowHelp(string constant)
{
Help.ShowHelp(dummyFormForHelp.Value, CHMFile, HelpNavigator.Topic, constant);
}
除了我在帮助文件中单击 GO>URL... 或 Print 按钮时,它工作正常。
[
我没有收到消息,应用程序和 chm 文件根本没有响应。我需要去任务管理器并终止进程。我不知道它是什么。
我尝试使用来自只有一个表单的简单 Windows 表单应用程序的相同代码打开同一个文件,一切都很完美。所以我认为我的申请有问题。
什么会导致这样的问题? 这是一个有很多屏幕的大型企业应用程序。
打开CHM的代码片段好像不太干净(??? dummyFormForHelp.Value
, constant
)。 Help.ShowHelp()
就像是对 HTMLHelp API 调用的包装(另请参阅:HTMLHelp API - VBA, VB6 und VB2003)。参数有点死板
再想一想 - 请阅读 HTMLHelp API - HH_CLOSE ALL Note 并交叉检查您的代码。由于 HH API 中的错误,请确保您在主窗体的 Query_Unload 事件中调用它而不是 OnClose。
请使用正确的参数调用 Help.ShowHelp()
函数,如下所示。
Help.ShowHelp(this, CHMFile, HelpNavigator.Topic, "foobar.htm");
从上面的示例应用程序屏幕截图来看,以下所有代码都适用于我。请尝试您的需求。打开 URL 在这里很特别,而不是您的屏幕截图中显示的那个 (URL ...)。
#region mnuHelp ---------------------------------------------
private void mnuHelpContents_Click(object sender, EventArgs e)
{
//--- Show contents of help file.
Help.ShowHelp(this, helpProviderMain.HelpNamespace);
}
private void mnuHelpIndex_Click(object sender, EventArgs e)
{
//--- Show index of help file.
Help.ShowHelpIndex(this, helpProviderMain.HelpNamespace);
}
private void mnuHelpSearch_Click(object sender, EventArgs e)
{
//--- Show search tab of help file.
Help.ShowHelp(this, helpProviderMain.HelpNamespace, HelpNavigator.Find);
}
private void mnuHelpTest_Click(object sender, EventArgs e)
{
//--- Show a web site with help content.
Help.ShowHelp(this, "http://www.whosebug.com");
}
private void mnuHelpOpenTopicByName_Click(object sender, EventArgs e)
{
//--- Open topic by name.
Help.ShowHelp(this, helpProviderMain.HelpNamespace, HelpNavigator.Topic, "Garden/tree.htm");
}
private void mnuHelpOpenTopicById_Click(object sender, EventArgs e)
{
//--- Open topic by ID.
Help.ShowHelp(this, helpProviderMain.HelpNamespace, HelpNavigator.TopicId, "20010");
}
#endregion -----------------------------------------------
编辑:
下载并 运行 我们的 MJ's Diagnostics 工具。
MJ 的诊断程序是一个小型实用程序,它会报告所有 HTML 帮助 运行time & Workshop(编译器)DLL 是否已安装并注册到正确的位置。如果您遇到编译器崩溃,并且在打开 CHM 或从 CHM 搜索选项卡搜索时崩溃,那么此实用程序将帮助解决 rouge DLL 问题。
首先问题描述的不是很清楚:
- 值得一提的是,chm 文件是由 NuHelp 生成的(这是临时解决方案,但我们都知道临时永远是永久性的,对吧?))
dummyFormForHelp.Value
在这里什么也没说,它只是延迟初始化的表单实例,以防止帮助 window 的最顶层位置并允许在应用程序和帮助 之间切换
dummyFormForHelp.Value
表示:
private static readonly Lazy<Form> dummyFormForHelp = new Lazy<Form>(() =>
{
var form = new Form();
form.CreateControl();
return form;
});
返回 WinForms<>CHM 帮助的原始问题:
- 只有在应用程序打开帮助时才会出现问题,如果直接打开帮助 - 完全没有问题
- 当导航至 URL、在“搜索”选项卡中打印或键入任何世界时,100% 陷入无限循环
研究表明您的应用程序冻结和打开的 chm 问题不是唯一的:
- Bug in some versions of Windows
- Issues with CHM generated by RoboHelp
- 关于连接的主题 Help.ShowHelp hangs in endless loop on Windows 10 和惊人的答案:不幸的是,这是 Windows 帮助系统的问题,而不是 Windows 表单。拥有帮助系统的团队目前不接受连接反馈,因此我们不能将此作为连接问题处理。感谢您的报告。
- 带有挂起的堆栈示例 here
解决方案
解决问题的方法:
- 尝试 NuHelp 的最新版本
- 尝试不同的转换器并检查是否有帮助
- 不使用任何转换器,自行生成帮助文件
- 作为不同的进程启动帮助
作为不同的进程启动帮助:
hh 添加到 windows 路径,因此可以轻松执行此类命令:
hh "help.chm::/topic.html"
hh "help.chm::/topic.html#subtopic"
hh -mapid 12345 help.chm
解决方法的缺点:应用程序每次调用帮助都会打开新的帮助实例。
编辑:2017 年 8 月 28 日
对于未来的读者:
- 不同常用转换器的重新编译没有帮助
- 使用帮助和手册重新创建了帮助,
- 索引已返回,关键字配置正确,搜索已返回
- 使用了
hh
的调用
现在帮助按预期工作。
这是 Windows 10 的一个错误,已在 Windows 10、v1607/build 14393 中修复。
它至少出现在 Windows 10、v1507/build 10240 和 v1511/build 10586 中。 (我已经为该主题创建了一个 Connect issue,但不幸的是,该站点已无法访问。)