chm文件是Windows操作系统非常方便的电子帮助文档及电子书籍文档。制作CHM文档的工具也有数种,较为流行的有EasyChm等。
这里对CHM制作进行一次详解,使开发人员能够开发出自己的CHM编译工具。当看完这篇教程之后,您会觉得制作一个类似EasyChm的工具非常简单,而像EasyChm这样的工具其实无需注册码激活,因为它根本没有涉及chm编码解码的工作,它只是使用了微软提供了编码解码工具而已,只不过它提供了便利的途径。
一.CHM编译工具:hhc.exe hha.dll
命令:hhc $path/which.hhp
使用这样简单的命令,就可以轻松地生成一个CHM文档,我们要了解的就是which.hhp是一个怎样的文件,后面会有介绍。
二.CHM反编译工具:hh.exe
命令:hh $target_folder source_chm.chm
命令仍是如此简单,$target_folder即是将chm抽取出的html文件放到的目标文件夹,source_chm.chm就是要被反编译的CHM文档。
三.HHP (P=Project)解析。
; which.hhp
[OPTIONS]
Compatibility=1.1 or later-------------------------兼容版本
Compiled file=..\..\..\linqc.chm-------------------产生的CHM文档位置及文档名
Contents file=Table of Contents.hhc-------------hhc文件,html文件归档,后面介绍。
Display compile progress=Yes--------------------是否显示编译进度
Index file=Index.hhk--------------------------------索引文件,即是CHM文档的索引选项卡
Language=0x804------------------------------------语言
title=Fist_chm----------------------------------------chm文档的标题
Default topic=a.html--------------------------------开始页,即刚打开CHM显示的页面.
ImageType=Folder----------------------------------图标类型,默认为Picture后面会有介绍。
.hhp文档相当于一个INI文档,描述了编译选项,主要的文档还是hhc和hhk文档,它们描述了要编译的HTML文件和INDEX选项。
四.HHC (C=Content)解析
<!-- Table of Contents.hhc --><html><body><UL> <LI> <OBJECT type="text/sitemap"> <param name="Name" value="display_name"> <param name="Local" value="a.html"> <param name="ImageNumber" value="11"> </OJBECT></UL></body></html>
<UL>代表父项,代表文件夹。
<LI>代表子项,代表文件。
只要在 <LI>后面加个 <UL>,再添加相应的子项,就可以把<LI>的项变成父项.
我们主要要分析的是 <OBJECT>对象,它里面的<param>对象又才是主要描述了内容。
属性 | 值 | 代表的意思 |
Name | Name | value指定了显示在列表框中的名称 |
Local | value指定了该项对象的HTML文档 | |
ImageNumber | value指定了该项使用何种图标 |
这里主要讨论 ImageNumber,请看下图:
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN"><HTML><HEAD></HEAD><BODY><OBJECT type="text/site properties"> <param name="Window Styles" value="0x800025"></OBJECT></BODY></HTML>
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
上面的是默认的 (可加可不加)。
<OBJECT type="text/site properties"> <param name="ImageList" value="file:\\E:\Firefly\DOC61\kingbase\doc\chm\KingbaseES\iconstip.bmp"> <param name="Image Width" value="16"> <param name="Color Mask" value="0xff"></OBJECT>
如果<OBJECT>中没有 ImageNumber项时,如果HHP文件中的 ImageType == Picture(默认是Picture)时,如果有子目录,就显示,否则显示;如果 ImageType == Folder,如果有子目录,就显示,否则显示。
=============================================
HHC文件其实是一个HTML文件。
五.HHK解析
<!—Index.hhk --><html><body><UL> <LI> <OBJECT type="text/sitemap"> <param name="Name" value="display_Index"> <param name="Local" value="a.html"> </OJBECT></UL></body></html>
与 HHC文件类似,它也是一个HTML文件,内容也类似,这里不再赘述,它只有两项。
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
到这里,CHM已经介绍完了。总结一下,制作流程应该如下:
- 制作 HHP文件,它指定了 HHC文件和 HHK文件。
- 制作 HHC 文件,使用文件夹遍历方式即可遍历所有HTM/HTML文档,并去检索HTM/HTML文档中的 <title>作为标题。
- 制作 HHK 文件,如果要使用索引,就可以把 <title>作为索引项,与HHC类似。
- 使用 hhc which.hhp 进行编译。
- 完成。
编码应该是很简单的事情了。
来源:https://www.cnblogs.com/lin1270/archive/2011/12/21/2295860.html