打开CHM文件产生:“导航到网页被取消”

我正在尝试打开一个.chm文件。

我下载了源代码,提取了它,然后双击Waffle.chm并单击“打开”,但无论chm文件中的哪个元素单击,我都会收到以下消息:

 Navigation to the webpage was canceled. What you can try: Retype the address. 

在这里输入图像说明

这里发生了什么?

概要

当从网络驱动器(或UNC路径 )打开时,Microsoft安全更新896358和840315阻止显示CHM文件内容。 这是窗口试图阻止病毒/恶意软件的攻击媒介感染您的计算机,并阻止了.chm文件,该文件通过此chm文件使用的“InfoTech”协议来绘制数据。

微软的问题总结: http : //support.microsoft.com/kb/896054

解决方案

  1. 如果您使用Windows server 2008,Windows 7,Windows已经创建了一个快速修复。 右键单击chm文件,将会出现“yourfile.chm Properties”对话框,在底部会出现一个名为“Unblock”的按钮。 点击取消阻止,然后按OK,然后尝试再次打开chm文件,它可以正常工作。 在WinXP(SP3)之前,此选项不适用于早期版本的Windows。

  2. 通过移动您的chm文件关闭网络驱动器解决问题。 您可能不知道您正在使用网络驱动器,现在再次检查:右键单击您的.chm文件,单击属性并查看“位置”字段。 如果它以两个反斜杠开始,如: \\epicserver\blah\ ,那么您正在使用网络驱动器。 所以要解决它,复制CHM文件,并将其粘贴到本地驱动器,如C:\或E :. 然后尝试重新打开chm文件,windows不会吓坏了。

  3. 不得已而为之,如果您不能将文件复制/移出网络驱动器。 如果你必须打开它的位置,而且你使用的是像XP,Vista,ME或者其他的较小版本的Windows,你将不得不手动告诉Windows不要在这个.chm文件中大惊失色。 HHReg(HTML帮助注册实用程序)实用程序自动执行此任务。 基本上你下载的HHReg工具,加载你的.chm文件,按下确定,它会创建必要的注册表键告诉Windows不要阻止它。 欲了解更多信息: http : //www.winhelponline.com/blog/fix-cannot-view-chm-files-network-xp-2003-vista/

Windows 8或10? – >升级到Windows XP。

“解除阻止”文件修复了这个问题。 截图:

在这里输入图像说明

除了Eric Leschinski的回答之外,还因为这是一个程序化的解决方案:

Windows使用隐藏文件叉将内容标记为“已下载”。 截断这些解锁文件。 用于CHM的流的名称是“Zone.Identifier”。 可以通过在打开文件时附加:streamname来访问流。 (第一次保存备份,以防RTL混乱!)

在Delphi中它看起来像这样:

 var f : file; begin writeln('unblocking ',s); assignfile(f,'some.chm:Zone.Identifier'); rewrite(f,1); truncate(f); closefile(f); end; 

我被告知,在非分叉文件系统(如FAT32)中有隐藏的文件,但我还没有得到的底部。

Ps Delphi的DeleteFile()也应该识别叉。

Win 8 x64:

只是将其移动到另一个文件夹或重命名您的文件夹(在我的情况下:我的文件夹是“C#”)。 避免使用文件夹名称上的符号。 用字母命名。

完成。

最终的解决方案是允许InfoTech协议在Intranet区域中工作。

将以下值添加到注册表中,问题应该解决:

 [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\HTMLHelp\1.x\ItssRestrictions] "MaxAllowedZone"=dword:00000001 

更多信息在这里: http : //support.microsoft.com/kb/896054

转到开始

键入regsvr32 hhctrl.ocx

你应该得到一个成功的消息,如:

“hhctrl.ocx中的DllRegisterserver成功”

现在尝试再次打开您的CHM文件。

另一种方式是使用不同的第三方软件。 此链接显示更多的第三方软件来查看CHM文件…

我尝试了SumatraPDF,它工作正常。

我使用C ++ Builder以编程方式在我的软件中修复了这个问题。

在我分配CHM帮助文件之前, Application->HelpFile = HelpFileName ,我检查它是否包含“Zone.Identifier”流,当它的时候,我只是删除它。

 String ZIStream(HelpFileName + ":Zone.Identifier") ; if (FileExists(ZIStream)) { DeleteFile(ZIStream) ; } 

显然有不同级别的认证。 我读的大多数文章告诉你将MaxAllowedZone设置为'1',这意味着本地机器区域和内联网区域是允许的,但'4'允许访问'所有'区域。

有关更多信息,请阅读以下文章: https : //support.microsoft.com/en-us/kb/892675

这是我的注册表看起来(我不知道它会与通配符工作,但它似乎为我工作):

 Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\HTMLHelp] [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\HTMLHelp\1.x] [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\HTMLHelp\1.x\ItssRestrictions] "MaxAllowedZone"=dword:00000004 [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\HTMLHelp\1.x\ItssRestrictions] "UrlAllowList"="\\\\<network_path_root>;\\\\<network_path_root>\*;\\ies-inc.local;http://www.*;http://*;https://www.*;https://*;" 

作为一个额外的说明,奇怪的是“UrlAllowList”键是需要使这个工作在另一台PC上,但不是我的测试。 这可能不是必需的,但是当我添加它时,它解决了这个问题。 用户可能没有关闭原始文件或类似的东西。 所以只是一个考虑。 我建议至少尝试一下,测试一下,如果需要的话可以添加。 一旦确认,您可以根据需要进行部署。 祝你好运!

编辑: PS另一种工作方法是通过使用mklink / d(Windows 7或更新版本中的符号链接)本地映射路径到网络,但映射网络驱动器号(Z:测试)没有工作。 只是食物的思想,我不必“解锁”任何文件。 另外接受的“解决方案”并没有解决我的问题。