单击 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 问题不是唯一的:

解决方案

解决问题的方法:

  • 尝试 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,但不幸的是,该站点已无法访问。)