我正在尝试打开一个 .chm 文件。
我下载了源代码,解压缩它,然后双击Waffle.chm
并单击“打开”,但无论我单击 chm 文件中的哪个元素,我都会收到以下消息:
Navigation to the webpage was canceled.
What you can try:
Retype the address.
这里发生了什么?
概括
当从网络驱动器(或UNC 路径)打开时,Microsoft 安全更新 896358 和 840315 会阻止显示 CHM 文件内容。这是 Windows 试图阻止病毒/恶意软件的攻击媒介感染您的计算机,并阻止了通过该 chm 文件使用的“InfoTech”协议绘制数据的 .chm 文件。
微软对问题的总结:http: //support.microsoft.com/kb/896054
解决方案
如果您使用的是 Windows Server 2008、Windows 7,windows 已经创建了快速修复。 右键单击 chm 文件,您将看到“yourfile.chm 属性”对话框,在底部,会出现一个名为“Unblock”的按钮。单击取消阻止并按确定,然后尝试再次打开 chm 文件,它可以正常工作。此选项不适用于 WindowsXP (SP3) 之前的早期版本的 Windows。
通过将 chm 文件移出网络驱动器来解决问题。您可能不知道您正在使用网络驱动器,现在仔细检查:右键单击您的 .chm 文件,单击属性并查看“位置”字段。如果它以这样的两个反斜杠开头:\\epicserver\blah\
,那么您正在使用网络驱动器。 因此,要修复它,请复制 chm 文件,并将其粘贴到本地驱动器中,例如 C:\ 或 E:。 然后尝试重新打开 chm 文件,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。
“解锁”文件可以解决问题。截屏:
除了 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() 也应该能识别分叉。
赢得 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”,这意味着允许本地机器区域和 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:用于测试)不起作用。只是深思熟虑,我不必“解锁”任何文件。此外,接受的“解决方案”并没有为我解决问题。
移动到本地文件夹是最快的解决方案,尤其是因为我不是系统上的管理员(无法编辑注册表等),这对我来说没有任何用处,这是工作环境中的典型案例。
Create a folder in C:\help drive, lets call it help and copy the files there and open.
不要复制到 mydocuments 或其他任何地方,这些位置通常位于办公室设置中的网络驱动器上,并且无法正常工作。