简介:HTML Help Workshop 汉化版面向需要制作 CHM 帮助文档的中文用户,包括软件开发者、技术写手及普通使用者,主要解决原版英文界面带来的语言障碍,让国内用户能更顺畅地创建和编辑 Windows 平台下可搜索、可压缩的 CHM 帮助文件。压缩包共 4 个文件,以 txt 说明文档、html 页面和 exe 安装程序为主,整体约 3.34MB,其中 txt 记录汉化过程与使用注意事项,html 为发布页面副本,exe 则是可直接安装的汉化主程序。该工具集成 HTML 编辑器、索引工具、项目管理器、编译器与预览器,可完成从新建项目、添加资源、编辑内容、构建关键词索引到设置属性、预览效果并最终编译打包的完整流程。目前已有 941 人学习下载,适合希望快速上手 CHM 制作、降低学习门槛的读者参考使用。
1. 从一份被冷落的 CHM 工程说起:HTML Help Workshop 汉化版到底能干什么
如果你手头有一堆.hhp、.hhc、.hhk文件,却对着英文界面发怵,那 HTML Help Workshop 汉化版就是冲着你来的。它本质上是微软早年那套 CHM 编译工具链的本地化版本,核心功能没变:把 HTML 页面、目录树、索引关键字打包成一个.chm文件。很多人以为 CHM 已经过时,但工控设备、医疗仪器、军工单位的内网文档系统里,CHM 依然是离线帮助的首选格式——体积小、检索快、不依赖浏览器内核。汉化版解决的是操作门槛问题:菜单、对话框、编译报错信息全部中文化,新手不用一边查词典一边点按钮。适合谁?需要维护老旧技术文档的工程师、给客户交付离线手册的售后团队、以及被要求“把网页帮助转成 CHM”的倒霉蛋。下面我把这套工具从安装到编译再到排错,完整走一遍。
2. 汉化版环境搭建与工程结构拆解
2.1 安装包选择与系统兼容性处理
HTML Help Workshop 原版是随 Visual Studio 6.0 时代发布的,汉化版通常是在原版 4.74.8702 基础上替换了资源字符串。我一般会从两个渠道拿包:一是汉化作者打包的独立安装程序,二是绿色解压版。独立安装程序会写注册表,把.hhp文件关联到hhw.exe,绿色版则要手动关联。在 Win10/Win11 上跑,大概率会遇到两个问题:一是安装程序报“不支持当前操作系统”,二是编译时hhc.exe崩溃。前者用兼容模式解决,后者需要替换一个itcc.dll文件。
具体操作步骤:
# 假设你拿到的是绿色解压版,目录结构如下 # HTMLHelpWorkshop/ # hhw.exe # 主程序 # hhc.exe # 目录编译器 # hha.dll # 帮助作者 DLL # itcc.dll # 旧版依赖,Win10 下需替换 # lang/ # 汉化资源文件 # 第一步:以管理员身份运行一次 hhw.exe,让它注册组件 # 第二步:如果编译时提示“无法加载 itcc.dll”,把兼容版 itcc.dll 覆盖过去 # 第三步:设置 .hhp 文件关联(可选) assoc .hhp=HTMLHelpProject ftype HTMLHelpProject="C:\Tools\HTMLHelpWorkshop\hhw.exe" "%1"逻辑说明:hhw.exe是图形界面主程序,负责工程管理和调用编译器;hhc.exe是命令行编译器,实际把 HTML 和目录文件压成 CHM。itcc.dll是旧版 HTML 解析库,Win10 自带的版本可能不兼容,替换成汉化包内附带的版本即可。参数方面,assoc和ftype是 Windows 自带的文件关联命令,路径按你实际解压位置改。注意:如果公司电脑有软件白名单,绿色版可能被拦截,此时用安装版并让 IT 放行hhw.exe和hhc.exe。
2.2 工程文件三件套:hhp、hhc、hhk 的分工
一个标准的 CHM 工程至少包含三个文件:.hhp是工程文件,记录标题、默认页、编译输出路径;.hhc是目录文件,定义左侧导航树的层级;.hhk是索引文件,定义关键字索引。很多人只建.hhp就点编译,结果生成的 CHM 没有目录,用户只能一页页翻——这是最常见的翻车点。
我一般会先建一个最小工程骨架:
<!-- 文件:demo.hhp --> [OPTIONS] Compatibility=1.1 or later Compiled file=output\demo.chm Contents file=democ.hhc Index file=demo.hhk Default topic=html\index.html Title=设备操作手册 Language=0x804 中文(简体) [FILES] html\index.html html\chapter1.html html\chapter2.html [INFOTYPES]<!-- 文件:democ.hhc --> <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN"> <HTML> <BODY> <OBJECT type="text/site properties"> <param name="ImageType" value="Folder"> </OBJECT> <UL> <LI><OBJECT type="text/sitemap"> <param name="Name" value="第一章 安全须知"> <param name="Local" value="html\chapter1.html"> </OBJECT> <LI><OBJECT type="text/sitemap"> <param name="Name" value="第二章 操作流程"> <param name="Local" value="html\chapter2.html"> </OBJECT> </UL> </BODY> </HTML>逻辑说明:.hhp里的[FILES]段必须列出所有要打包的 HTML 文件,漏掉的文件不会进 CHM,运行时点链接会报“无法显示网页”。Contents file指向.hhc,Index file指向.hhk,Default topic是打开 CHM 时默认显示的页面。.hhc用<OBJECT type="text/sitemap">定义每个节点,Name是显示文字,Local是相对路径。参数Language=0x804表示简体中文,不写的话索引排序会按英文规则,中文关键字排得乱七八糟。
注意:
.hhc文件必须保存为 UTF-8 带 BOM 或 GB2312 编码,用 UTF-8 无 BOM 会导致中文目录名乱码。我习惯用 Notepad++ 转成“UTF-8-BOM”。
3. 从 HTML 到 CHM:编译流程与参数调优
3.1 图形界面编译与命令行编译的差异
汉化版提供了两种编译方式:点“文件→编译”走图形界面,或者用hhc.exe命令行。图形界面适合调试阶段,能看到具体报错行;命令行适合集成到构建脚本里,比如每天自动从文档仓库拉取 HTML 然后打包。
命令行编译示例:
# 进入工程目录 cd /d D:\docs\demo # 调用编译器,指定 .hhp 文件 "C:\Tools\HTMLHelpWorkshop\hhc.exe" demo.hhp # 如果成功,会在 output 目录生成 demo.chm # 如果失败,查看同目录下的 demo.log逻辑说明:hhc.exe接受.hhp文件路径作为唯一参数,编译日志默认写在同目录的.log文件里。常见错误码:HHC5003表示某个 HTML 文件找不到,HHC5010表示目录文件语法错误,HHC3004表示索引关键字重复。图形界面里这些错误会弹窗,命令行下只能看日志。我一般会在 CI 脚本里加一句type demo.log,把日志打到控制台。
参数调优方面,.hhp的[OPTIONS]段有几个关键开关:
| 参数 | 作用 | 推荐值 |
|---|---|---|
Compatibility | 兼容的 HTML Help 版本 | 1.1 or later |
Compiled file | 输出 CHM 路径 | output\xxx.chm |
Default topic | 默认首页 | html\index.html |
Title | CHM 窗口标题 | 按文档实际名称 |
Language | 语言 ID | 0x804简体中文 |
Full-text search | 是否启用全文检索 | Yes |
Binary TOC | 二进制目录(加快加载) | Yes |
Full-text search=Yes会生成全文索引,CHM 体积增大但检索快;Binary TOC=Yes把目录树编译成二进制,打开时不用解析 HTML,加载速度明显提升。这两个开关在文档页数超过 200 页时效果显著。
3.2 目录树与索引的自动化生成思路
手工写.hhc和.hhk在文档超过 50 页时就是折磨。我一般用 Python 脚本从 HTML 的<h1>、<h2>标签自动提取目录结构,生成.hhc文件。索引则从<meta name="keywords">里抓关键字。
# generate_hhc.py # 遍历 html 目录,按 h1/h2 生成目录树 import os import re def scan_html(root_dir): entries = [] for dirpath, _, filenames in os.walk(root_dir): for fn in sorted(filenames): if not fn.endswith('.html'): continue full_path = os.path.join(dirpath, fn) rel_path = os.path.relpath(full_path, root_dir).replace('\\', '/') with open(full_path, 'r', encoding='utf-8') as f: content = f.read() # 提取第一个 h1 作为节点名 m = re.search(r'<h1[^>]*>(.*?)</h1>', content, re.I | re.S) title = m.group(1).strip() if m else fn entries.append((title, rel_path)) return entries def write_hhc(entries, out_file): with open(out_file, 'w', encoding='utf-8-sig') as f: f.write('<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">\n') f.write('<HTML><BODY>\n<UL>\n') for title, path in entries: f.write(' <LI><OBJECT type="text/sitemap">\n') f.write(f' <param name="Name" value="{title}">\n') f.write(f' <param name="Local" value="{path}">\n') f.write(' </OBJECT>\n') f.write('</UL>\n</BODY></HTML>\n') if __name__ == '__main__': items = scan_html('html') write_hhc(items, 'democ.hhc') print(f'生成 {len(items)} 个目录节点')逻辑说明:scan_html递归遍历html目录,用正则抓每个文件第一个<h1>的内容作为目录节点名。write_hhc按 CHM 要求的格式输出,注意编码用utf-8-sig,带 BOM 才能让汉化版正确识别中文。参数方面,root_dir改成你的 HTML 根目录,输出文件名要和.hhp里的Contents file一致。这个脚本只做一级目录,如果需要二级,可以再抓<h2>嵌套<UL>。
注意:自动生成的目录顺序按文件名排序,如果章节顺序和文件名不一致,需要在脚本里加一个排序映射表,否则用户看到的目录是乱的。
4. 避坑与排查:汉化版特有的五个翻车现场
4.1 编译成功但 CHM 打开空白
现象:hhc.exe返回 0,生成了.chm文件,双击打开左侧目录正常,右侧内容区一片空白。原因:.hhp里Default topic指向的 HTML 文件路径大小写和实际文件不一致。Windows 文件系统不区分大小写,但 CHM 编译器区分。解决:把Default topic和[FILES]里的路径全部改成小写,或者与实际文件名严格一致。
4.2 中文目录名显示为乱码
现象:左侧目录树里中文变成“锟斤拷”或问号。原因:.hhc文件保存成了 UTF-8 无 BOM,汉化版按 ANSI 编码解析。解决:用 Notepad++ 打开.hhc,编码→转为 UTF-8-BOM,重新编译。如果还是乱码,检查.hhp里Language是否设成了0x804。
4.3 索引关键字无法跳转
现象:索引标签页里能看到关键字,但双击后提示“找不到主题”。原因:.hhk文件里<param name="Local" value="...">的路径写成了绝对路径或带了盘符。解决:.hhk里的路径必须是相对于.hhp所在目录的相对路径,且用反斜杠。我一般用脚本统一替换成正斜杠再转反斜杠。
4.4 编译时提示“无法打开文件 itcc.dll”
现象:点编译后弹窗报错,CHM 生成失败。原因:Win10 自带的itcc.dll版本比汉化版依赖的版本新,接口不兼容。解决:从汉化包里的redist目录找到旧版itcc.dll,复制到hhw.exe同目录,或者注册到系统目录。如果公司电脑不允许替换系统 DLL,就把汉化版整个目录放到一个独立文件夹,把旧 DLL 放在同目录,程序会优先加载同目录的。
4.5 生成的 CHM 在客户机器上打不开
现象:自己电脑上正常,发给客户后提示“导航到网页已取消”。原因:CHM 文件从网络下载或通过邮件附件传输后,Windows 会自动加上“锁定”属性。解决:让客户右键 CHM 文件→属性→勾选“解除锁定”。如果客户批量部署,可以用 PowerShell 脚本批量解锁:
# 批量解除 CHM 文件锁定 Get-ChildItem -Path "D:\docs\*.chm" | Unblock-File逻辑说明:Unblock-File是 PowerShell 内置命令,去掉文件流里的 Zone.Identifier 标记。参数-Path支持通配符,也可以递归-Recurse。这个坑在售后交付时特别常见,提前在交付说明里写一句能省很多电话。
5. 进阶技巧:用脚本批量编译与版本号注入
当你手里有十几个产品的文档工程,每个都要单独打开汉化版点编译,效率太低。我一般写一个批处理脚本,遍历所有.hhp文件,依次调用hhc.exe,并把编译结果汇总到一个日志里。更进一步,可以在编译前动态修改.hhp里的Title,把版本号注入进去。
@echo off setlocal enabledelayedexpansion set HHW=C:\Tools\HTMLHelpWorkshop\hhc.exe set LOG=build_all.log echo 编译开始 %date% %time% > %LOG% for /r D:\docs %%f in (*.hhp) do ( echo 正在编译 %%f >> %LOG% "%HHW%" "%%f" >> %LOG% 2>&1 if !errorlevel! neq 0 ( echo 失败: %%f >> %LOG% ) else ( echo 成功: %%f >> %LOG% ) ) echo 编译结束 %date% %time% >> %LOG% type %LOG%逻辑说明:for /r递归遍历D:\docs下所有.hhp文件,%%f是当前文件路径。hhc.exe的输出重定向到日志,errorlevel判断是否成功。参数方面,HHW改成你的实际路径,LOG是日志文件名。这个脚本可以挂到 Jenkins 或 GitLab CI 的定时任务里,每天凌晨自动编译所有文档工程。
版本号注入的思路:在.hhp的Title里写一个占位符,比如Title=设备手册 {VERSION},编译前用sed或 PowerShell 替换成实际版本号。这样每次发版只需要改一个变量,不用手动改每个工程文件。
注意:批量编译时如果某个工程报错,
hhc.exe可能弹窗等待用户点击,导致脚本卡死。解决办法是在.hhp里加[OPTIONS]段Display compile progress=No和Error log file=xxx.log,让编译器把错误写日志而不是弹窗。
从那以后我每次交付 CHM 之前,都会强制走一遍“命令行编译 + 日志检查 + 客户机解锁测试”三步,再也没被售后电话追着跑。希望帮到你。
本文还有配套的精品资源,点击获取