我正在尝试打开.chm文件。
我下载了源代码,将其解压缩,然后双击Waffle.chm
并单击“打开”,但是无论我单击的chm文件中的哪个元素,我都会收到以下消息:
Navigation to the webpage was canceled.
What you can try:
Retype the address.
这里发生了什么?
Answers:
概要
从网络驱动器(或UNC路径)打开时,Microsoft安全更新896358和840315阻止CHM文件内容的显示。这是Windows试图阻止病毒/恶意软件的攻击媒介感染您的计算机,并且阻止了.chm文件,该文件通过“ chm文件”使用“ InfoTech”协议绘制数据。
Microsoft的问题摘要:http : //support.microsoft.com/kb/896054
解决方案
如果您使用的是Windows Server 2008,Windows 7,则Windows已创建了一个快速修复程序。 右键单击chm文件,您将获得“ yourfile.chm属性”对话框,在底部,出现一个名为“取消阻止”的按钮。单击取消阻止,然后按确定,然后尝试再次打开chm文件,它可以正常工作。对于WindowsXP(SP3)之前的Windows早期版本,此选项不可用。
通过将chm文件移离网络驱动器来解决此问题。您可能没有意识到自己正在使用网络驱动器,请立即仔细检查:右键单击.chm文件,单击属性,然后查看“位置”字段。如果它以两个这样的反斜杠开头:\\epicserver\blah\
,则说明您正在使用网络驱动器。 因此,要修复此问题,请复制chm文件,然后将其粘贴到本地驱动器中,例如C:\或E:。 然后尝试重新打开chm文件,Windows不会出现异常。
万不得已,如果您无法从网络驱动器上复制/移动文件。如果必须将其打开,并且使用的是Windows,XP,Vista,ME或其他版本的较小版本的Windows,则必须手动告诉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。
“取消阻止”文件可解决该问题。屏幕截图:
赢得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)上,有隐藏的文件,但我还没有深入了解它。
Ps Delphi的DeleteFile()也应该识别派生。
最终的解决方案是允许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文件。
认证的级别显然不同。我阅读的大多数文章都告诉您将MaxAllowedZone设置为“ 1”,这意味着允许本地计算机区域和Intranet区域,但是“ 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:用于测试)无效。只是值得深思,我不必“取消阻止”任何文件。同样,公认的“解决方案”也无法解决我的问题。