CHM制作详解

CHM制作详解

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后面会有介绍。

[INFOTYPES]

=============================================================

.hhp文档相当于一个INI文档,描述了编译选项,主要的文档还是hhc和hhk文档,它们描述了要编译的HTML文件和INDEX选项。

四.HHC (C=Content)解析

    • 代表父项,代表文件夹。

    • 代表子项,代表文件。

      只要在

    • 后面加个
        ,再添加相应的子项,就可以把
      • 的项变成父项.

        我们主要要分析的是 对象,它里面的对象又才是主要描述了内容。

        属性

        值

        代表的意思

        Name

        Name

        value指定了显示在列表框中的名称

        Local

        value指定了该项对象的HTML文档

        ImageNumber

        value指定了该项使用何种图标

        这里主要讨论 ImageNumber,请看下图:

        这些是默认的图标(它可以从c:\Program Files\Common Files\Microsoft Shared\Help\ hxvz.dll中抽取出来),从1开始计数,依次递增,使用哪一个图标,就使用哪一个计数。当然,也可以使用自定义图标,不过一般没有必要。以下是使用自定义图标的编码:

        ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

        上面的是默认的 (可加可不加)。

        它在放在 最开始处。

        如果中没有 ImageNumber项时,如果HHP文件中的 ImageType == Picture(默认是Picture)时,如果有子目录,就显示,否则显示;如果 ImageType == Folder,如果有子目录,就显示,否则显示。

        =============================================

        HHC文件其实是一个HTML文件。

        五.HHK解析

        • 与 HHC文件类似,它也是一个HTML文件,内容也类似,这里不再赘述,它只有两项。

          ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

          到这里,CHM已经介绍完了。总结一下,制作流程应该如下:

          制作 HHP文件,它指定了 HHC文件和 HHK文件。

          制作 HHC 文件,使用文件夹遍历方式即可遍历所有HTM/HTML文档,并去检索HTM/HTML文档中的 作为标题。</p> <p>制作 HHK 文件,如果要使用索引,就可以把 <title>作为索引项,与HHC类似。</p> <p>使用 hhc which.hhp 进行编译。</p> <p>完成。</p> <p>编码应该是很简单的事情了。</p> </div> <div class="pagination"> <a href="/af9fa5f28a9018ca/81cae9a79a6d5357.html">← 俠盜獵車手 5 (GTA 5) online版差事任務報酬分紅系統解析</a> <a href="/af9fa5f28a9018ca/1399e138af1e6121.html">免费在线贝斯调音器 →</a> </div> </article> </div> <div class="main-content"> <h2 class="section-title">相关文章</h2> <div class="article-grid"> <div class="article-card"> <img src="/0.jpg" alt="诺奖得主、科学巨擘,24位思想家对爱因斯坦的独家记忆丨展卷" class="card-image"> <div class="card-body"> <span class="category-tag">365账号限制登录不了</span> <h3 class="card-title"><a href="/af9fa5f28a9018ca/98449b4d02f67eb5.html">诺奖得主、科学巨擘,24位思想家对爱因斯坦的独家记忆丨展卷</a></h3> <div class="card-meta"> <span>📅 08-10</span> <span>👁️ 8716</span> </div> </div> </div> <div class="article-card"> <img src="/0.jpg" alt="自制薯条🍟" class="card-image"> <div class="card-body"> <span class="category-tag">365bet体育在线大陆</span> <h3 class="card-title"><a href="/b5f3360e45544f6a/856584e5170684c5.html">自制薯条🍟</a></h3> <div class="card-meta"> <span>📅 10-19</span> <span>👁️ 9701</span> </div> </div> </div> <div class="article-card"> <img src="/0.jpg" alt="中国电信天翼宽带路由器怎么重启(天翼宽带路由重启)" class="card-image"> <div class="card-body"> <span class="category-tag">365bet体育在线大陆</span> <h3 class="card-title"><a href="/b5f3360e45544f6a/d0797d89b0995f02.html">中国电信天翼宽带路由器怎么重启(天翼宽带路由重启)</a></h3> <div class="card-meta"> <span>📅 12-28</span> <span>👁️ 8058</span> </div> </div> </div> </div> </div> <div class="friend-links"> <h3>友情链接</h3> <div class="friend-links-container"> <script> var _mtj = _mtj || []; (function () { var mtj = document.createElement("script"); mtj.src = "https://node90.aizhantj.com:21233/tjjs/?k=1tjqoiqkcfv"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(mtj, s); })(); </script> </div> </div> </div> <footer> <div class="container"> <p class="copyright">Copyright © <span id="currentYear"></span> 365账号限制登录不了-365bet体育在线大陆-365bet体育比分直播 All Rights Reserved.</p> </div> </footer> <script> document.getElementById('currentYear').textContent = new Date().getFullYear(); </script> <script type='text/javascript' src='/api.js'></script> <script type='text/javascript' src='/tongji.js'></script> </body> </html>