我正在尝试打开一个.chm文件。
我下载了源代码,解压缩后双击Waffle.chm
并单击“打开”,但无论我点击chm文件中的哪个元素,都会收到消息:
Navigation to the webpage was canceled.
What you can try:
Retype the address.
这里发生了什么?
摘要
Microsoft安全更新896358和840315会在从网络驱动器(或UNC路径)打开CHM文件时阻止显示其内容。这是Windows试图阻止病毒/恶意软件攻击向量感染您的计算机,并已封锁了使用“InfoTech”协议提取数据的.chm文件。
微软对该问题的总结:http://support.microsoft.com/kb/896054
解决方案
如果您正在使用Windows Server 2008、Windows 7,Windows已经创建了一个快速修复程序。右键单击chm文件,会出现“yourfile.chm属性”对话框,在底部会出现一个名为“解除锁定”的按钮。点击“解除锁定”,然后按OK,再尝试打开chm文件,它将正常工作。这个选项不适用于Windows XP(SP3)之前的早期版本。
通过将chm文件从网络驱动器中移走来解决问题。您可能没有意识到自己正在使用网络驱动器,请立即进行双重检查:右键单击.chm文件,单击属性,然后查看“位置”字段。如果以两个反斜杠开头,例如:\\epicserver\blah\,那么您正在使用网络驱动器。因此,为了解决这个问题,复制chm文件,然后粘贴到本地驱动器(如C:\或E:)。然后尝试重新打开chm文件,Windows就不会出错了。
如果您无法将文件从网络驱动器中复制/移动,则最后的办法是手动告诉Windows不要在这个.chm文件上出错。如果您必须在原地打开它,并且您正在使用较低版本的Windows,如XP、Vista、ME或其他版本,则必须手动告诉Windows不要在此.chm文件上出错。HHReg(HTML帮助注册工具)实用程序可以自动完成此任务。基本上,您需要下载HHReg实用程序,加载您的.chm文件,按OK,它将创建必要的注册表键来告诉Windows不要阻止它。更多信息:http://www.winhelponline.com/blog/fix-cannot-view-chm-files-network-xp-2003-vista/
Windows 8还是10? --> 升级到Windows XP。
“解除文件阻止”可以解决该问题。屏幕截图:
Win 8 x64:
只需将它移动到另一个文件夹或重命名您的文件夹(在我的情况下:我的文件夹名为“c#”)。避免在文件夹名称中使用符号,用字母来命名即可。
完成。
除了Eric Leschinski的答案之外,因为这是stackoverflow,我们还有一个编程解决方案:
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)上存在隐藏文件,但我还没有深入研究。
P.s. Delphi的DeleteFile()也应该识别分叉。
明确的解决方案是允许InfoTech协议在内部网络区域中工作。
添加以下值到注册表中,问题应该得到解决:
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\HTMLHelp\1.x\ItssRestrictions]
"MaxAllowedZone"=dword:00000001
该链接提供了有关IT技术的详细信息。转到开始菜单
输入 regsvr32 hhctrl.ocx
你应该会看到一个类似成功的信息:
" 在 hhctrl.ocx 中,DllRegisterServer 成功。"
现在再次尝试打开你的 CHM 文件。
我用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://*;"
将文件夹移动到本地是最快的解决方案,因为在工作环境中,我不是系统管理员(无法编辑注册表等),其他方法都没有效果。
Create a folder in C:\help drive, lets call it help and copy the files there and open.
不要复制到我的文档或其他任何地方,这些位置通常在办公室设置的网络驱动器上,无法正常工作。