简介:HTML Help Workshop 汉化版面向需要制作 CHM 帮助文档的中文用户,尤其适合软件开发者、技术写手及刚接触帮助文档制作的入门者。原版为微软官方英文界面,汉化后提供全中文操作环境,降低了语言门槛,便于快速上手创建可搜索的 CHM 文件。压缩包共 4 个文件,以 exe 安装程序为主,辅以 txt 汉化说明与 html 下载页面副本,整体约 3.34MB,体积轻巧便于留存。工具内置 HTML 编辑器、索引工具、项目管理器、编译器与预览器,覆盖从新建项目、添加资源、编辑内容、构建索引到编译打包的完整流程,可帮助读者掌握 CHM 文档的结构组织与编译要点。目前已有 941 人学习下载,适合希望系统了解 CHM 制作、对照汉化说明快速完成安装与配置的读者参考使用。
1. 老工具的新问题:为什么还要折腾 HTML Help WorkShop 汉化版
如果你手头维护过 Windows 桌面端的老项目,大概率见过.chm文件——按 F1 弹出来的那个帮助窗口,左边目录树、右边正文,还能全文检索。这套东西背后用的就是 HTML Help WorkShop,微软早年随 HTML Help SDK 一起发的编译工具。它能把一堆 HTML、CSS、图片打包成一个.chm,也能反向把.chm拆回源文件。问题在于,官方版本停在上古时期,界面全英文,在中文 Windows 上偶尔还会因为编码和路径问题翻车。汉化版就是在这个背景下被翻出来的:菜单、对话框、报错提示都换成了中文,对不熟悉英文界面的维护者友好不少。这篇不是科普,是把我自己拆包、编译、排错的过程完整记一遍,适合手里有老项目文档要维护、或者需要把现有 HTML 文档转成.chm分发的人。
2. 拆开看结构:汉化版到底改了哪些东西
2.1 核心可执行文件与资源替换逻辑
HTML Help WorkShop 的主体是hhw.exe,配套还有hhc.exe(目录编译器)、hhk.exe(索引编译器)以及一堆 DLL。汉化版的做法通常不是重写程序,而是替换资源段里的字符串表、对话框模板和菜单资源。常见做法是用资源编辑工具把hhw.exe里的STRINGTABLE、DIALOG、MENU逐条改成中文,再重新写回文件。这样做的好处是程序逻辑完全不动,风险低;代价是如果原版升级,汉化补丁就得重做。
我一般会先确认汉化版的文件结构,典型的目录长这样:
HTMLHelpWorkShop_CN/ ├── hhw.exe # 主程序,已替换中文资源 ├── hhc.exe # 目录编译器 ├── hhk.exe # 索引编译器 ├── hha.dll # 编译核心库 ├── itcc.dll # 图像/编码相关 ├── hh.dat # 默认配置 └── lang/ # 部分汉化版会外挂语言文件 └── chs.dll判断汉化是否彻底,不能只看主界面。打开「File → Compile」对话框,看按钮和提示是不是中文;再故意制造一个错误,比如引用一个不存在的 HTML 文件,看报错弹窗是中文还是英文。如果报错还是英文,说明字符串表没替换干净,这种版本在排查问题时反而更别扭。
2.2 编译链路:从 HTML 到 .chm 的四个阶段
不管界面汉化与否,.chm的生成链路是固定的。理解这条链路,后面排错才有方向。
第一阶段是项目文件(.hhp)解析。.hhp是纯文本,定义了标题、默认页、目录文件、索引文件、要打包的 HTML 列表。汉化版在这里没有改动,格式和原版一致。
第二阶段是目录和索引编译。hhc.exe读取.hhc(目录)和.hhk(索引),生成二进制结构。这一步最容易因为文件编码出问题——.hhc里如果有中文标题,必须存成带 BOM 的 UTF-8 或者 GBK,否则目录树会显示乱码。
第三阶段是内容压缩打包。hha.dll把所有 HTML、图片、CSS 按内部格式压缩进单一文件。这里有个坑:文件名大小写敏感。Windows 上不区分,但.chm内部索引区分,Index.HTML和index.html会被当成两个文件。
第四阶段是生成.chm并写入文件头。文件头里包含标题、默认页、语言 ID。语言 ID 如果设成英文,中文内容在某些系统上搜索会异常。
下面是一个最小.hhp的示例,我把它当成模板用:
[OPTIONS] Compatibility=1.1 or later Compiled file=manual.chm Contents file=toc.hhc Index file=index.hhk Default topic=index.html Title=某系统操作手册 Language=0x804 Chinese (PRC) [FILES] index.html intro.html config.html images/logo.png [INFOTYPES]Language这一行是关键,0x804对应简体中文。如果写成0x409,全文检索对中文分词的处理会不一样,实测搜索命中率下降。Compatibility保持默认即可,改高了老系统打不开。
2.3 汉化版对编码问题的实际影响
原版在中文环境下最烦人的是两处:一是.hhp文件如果存成 UTF-8 无 BOM,标题会乱码;二是编译日志输出到控制台时中文变成问号。汉化版通常顺手修了第二处,因为汉化者自己也要看日志。第一处没法治,属于编译器底层行为,只能靠保存时选对编码。
我的习惯是:所有.hhp、.hhc、.hhk一律用 GBK 保存,HTML 文件用 UTF-8 加<meta charset="utf-8">。这样目录树和正文各走各的编码,互不干扰。如果团队里有人用 VS Code,记得在.vscode/settings.json里对*.hh*指定"files.encoding": "gbk",否则一保存就乱。
3. 动手编译:从零生成一个可检索的中文 .chm
3.1 准备源文件与目录结构
先建一个干净的目录,把所有要打包的东西放进去。我习惯按功能分子目录,但.hhp里的路径要写相对路径,且用反斜杠或正斜杠都行,汉化版对两者都认。
project/ ├── manual.hhp ├── toc.hhc ├── index.hhk ├── html/ │ ├── index.html │ ├── intro.html │ └── config.html └── images/ └── logo.pngtoc.hhc是目录文件,本质是一段带特殊<OBJECT>标签的 HTML。汉化版不会帮你生成它,得手写或者用工具导出。最小可用版本如下:
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN"> <HTML> <BODY> <OBJECT type="text/site properties"> <param name="Window Styles" value="0x800025"> </OBJECT> <UL> <LI><OBJECT type="text/sitemap"> <param name="Name" value="首页"> <param name="Local" value="html/index.html"> </OBJECT> <LI><OBJECT type="text/sitemap"> <param name="Name" value="简介"> <param name="Local" value="html/intro.html"> </OBJECT> </UL> </BODY> </HTML>Name是目录树显示的文字,Local是相对.hhp的路径。注意Local里不要写盘符或..跳出根目录,.chm编译时会拒绝,报错信息在汉化版里是「无法解析本地路径」,原版是英文,意思一样。
3.2 用命令行编译并捕获日志
图形界面点「Compile」适合调试,但批量生成时命令行更稳。汉化版的hhc.exe支持直接传.hhp:
# 进入工具目录,避免 DLL 找不到 cd /d D:\tools\HTMLHelpWorkShop_CN # 编译,输出日志到 build.log hhc.exe D:\project\manual.hhp > D:\project\build.log 2>&1 # 检查返回码,0 表示成功 echo %ERRORLEVEL%这里有个血泪经验:hhc.exe依赖同目录的hha.dll和itcc.dll,如果你在别的目录用绝对路径调用,它会因为找不到 DLL 而静默失败,返回码还是 0。所以要么先cd到工具目录,要么把工具目录加进PATH。日志里如果出现「HHA 编译器初始化失败」,基本就是 DLL 路径问题。
编译成功后,manual.chm会出现在.hhp同级目录。用hh.exe打开验证:
hh.exe D:\project\manual.chm3.3 验证目录、索引与全文检索
打开.chm后,重点看三处。目录树是否和toc.hhc一致,中文有没有乱码;索引标签页是否列出index.hhk里的关键词;按 Ctrl+F 或点「搜索」,输入一个正文里出现的中文词,看能不能命中。
如果目录正常但搜索不到中文,八成是Language没设对,或者 HTML 文件缺少<meta charset>。.chm的搜索索引在编译时生成,编码判断依赖 HTML 头。补上 meta 后重新编译即可。
如果索引标签页是空的,检查index.hhk是否存在且格式正确。它的结构和toc.hhc类似,只是Name换成关键词,Local指向锚点或页面。
<LI><OBJECT type="text/sitemap"> <param name="Name" value="配置文件"> <param name="Local" value="html/config.html"> </OBJECT>一个关键词可以对应多个Local,用多个<LI>并列即可。汉化版在这里没有额外限制,和原版行为一致。
4. 避坑与排查:汉化版特有的五个翻车点
4.1 现象:编译报错「无法打开文件」,但文件明明存在
原因:.hhp里用了绝对路径或中文路径,且路径里带空格。汉化版对空格的处理和原版一样烂,C:\My Docs\project会被截断成C:\My。
解决:所有路径改成相对路径,根目录不要有空格和中文。如果必须用中文目录,把整个项目移到纯英文路径下再编译。我现在的习惯是项目根目录一律D:\work\proj_xxx,省心。
4.2 现象:目录树中文显示为方框或乱码
原因:toc.hhc保存成了 UTF-8 无 BOM,编译器按 ANSI 解析,中文全错。
解决:用记事本或 Notepad++ 把toc.hhc转成 ANSI(GBK)编码。VS Code 里右下角点编码,选「通过编码保存」→「GBK」。改完重新编译,目录树立刻正常。
4.3 现象:全文检索搜不到中文,英文正常
原因:.hhp里Language设成了0x409(英文),或者 HTML 文件没有声明字符集。
解决:Language改成0x804,每个 HTML 文件头部加<meta http-equiv="Content-Type" content="text/html; charset=utf-8">。如果 HTML 是 GBK,meta 里写charset=gbk,但要和实际保存编码一致,否则正文乱码。
4.4 现象:汉化版界面部分菜单还是英文
原因:汉化补丁只替换了主程序资源,没覆盖hhc.exe或某个 DLL 的字符串表。
解决:这种属于汉化不完整,不影响功能,但排查问题时看英文报错会慢。我的做法是保留一份原版做对照,汉化版报错看不懂时,用原版复现一次,搜英文报错更快找到原因。
4.5 现象:编译成功但 .chm 打开空白
原因:Default topic指向的文件不在[FILES]列表里,或者路径大小写不一致。
解决:检查.hhp的Default topic和[FILES]段,确保默认页被显式列出。.chm内部索引区分大小写,Index.html和index.html是两个东西,统一用小写最稳。
5. 进阶技巧:批量编译与版本对照的固定套路
当你手里不止一个.hhp,而是十几个模块各自一份文档时,逐个点界面就太慢了。我一般写一个批处理,遍历目录下所有.hhp,统一编译并归档日志。
@echo off set TOOL=D:\tools\HTMLHelpWorkShop_CN set SRC=D:\work\docs set OUT=D:\work\build set LOG=%OUT%\build_%date:~0,4%%date:~5,2%%date:~8,2%.log if not exist "%OUT%" mkdir "%OUT%" cd /d "%TOOL%" for /r "%SRC%" %%f in (*.hhp) do ( echo [%time%] Compiling %%f >> "%LOG%" hhc.exe "%%f" >> "%LOG%" 2>&1 if errorlevel 1 ( echo [%time%] FAILED: %%f >> "%LOG%" ) else ( echo [%time%] OK: %%f >> "%LOG%" ) ) echo Done. Check %LOG% pause这段脚本的关键在cd /d "%TOOL%",保证 DLL 能被找到;for /r递归所有子目录;日志按日期命名,方便回溯。errorlevel判断在hhc.exe上不完全可靠,因为前面说过它可能静默失败,所以日志里还要人工扫一眼有没有「初始化失败」字样。
另一个习惯是保留一份原版工具做对照。汉化版报错信息虽然友好,但有些底层错误(比如压缩阶段的内存分配失败)汉化后反而丢失了原始错误码。我的做法是:日常用汉化版,遇到诡异问题切原版复现一次,拿到英文报错再去搜,命中率更高。
还有个小技巧:.chm编译完成后,可以用hh.exe -decompile反编译回 HTML,验证内容是否完整。
hh.exe -decompile D:\work\unpacked D:\work\build\manual.chm反编译出来的目录结构和源文件对比,能快速发现哪些文件没被打进去。我每次发版前都跑一遍这个反向验证,比肉眼翻目录靠谱。
从那以后我每次编译.chm都强制走一遍「命令行编译 → 反编译对照 → 搜索中文关键词」三步,再也没出现过发出去才发现目录乱码的情况。希望帮到你。
本文还有配套的精品资源,点击获取