chm と共に過ごした四半世紀の思い出話

# はじめに

* [Microsoft Compiled HTML Help \- Wikipedia](https://ja.wikipedia.org/wiki/Microsoft_Compiled_HTML_Help)

1997年 Windows 98 の時代に chm ファイルが生まれてから 25年経ちました。Windows 98 から XP までは、Windows 標準アプリケーションのヘルプ表示などでよく使われていました。

Windows Vista 以降、徐々に見る機会が減っています。2023年 1月現在では、一部の歴史あるアプリケーションで使われつづけていることもある、くらいになっています。

その chm についての思い出話です。よろしければお付き合いください。

また、今でも chm を更新することがある方に向けて、気を付けることを書いてみます。ロストテクノロジーすぎて、現在情報を手に入れることが難しくなっていますので。ソースがない・おぼろげな記憶に頼ったものも混ざっていますが、その点はご了承ください。


# chm の機能紹介 - TortoiseGit の例

* [TortoiseGit – Windows Shell Interface to Git](https://tortoisegit.org/)

手元の PC に入っているアプリケーションを調べてみると、 TortoiseGit のヘルプが chm を使い続けていました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118172/795ec822-7dc6-ab96-9470-22dacad5d1fb.png)

## HTML を表示できる

画像右側のコンテンツは HTML で作成しています。レンダリングエンジンの Internet Explorer でできることはなんでもできます。

HTML Help のもう一つ前の時代、Windows 95 の WinHelp は RTF 形式でした。 格段に表現力が上がりました。

* [Microsoft WinHelp \- Wikipedia](https://ja.wikipedia.org/wiki/Microsoft_WinHelp)

ちなみに WinHelp が OS 標準で扱えたのは Windows XP までです。Windows 8.1 までは追加ダウンロードで扱えましたが、こちらも Windows 8.1 のサポートが 2023-01-10 に切れてしまいました。

* [Download Windows 8\.1 用 Windows Help プログラム \(WinHlp32\.exe\) from Official Microsoft Download Center](https://www.microsoft.com/ja-jp/download/details.aspx?id=40899)


## 目次

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118172/795ec822-7dc6-ab96-9470-22dacad5d1fb.png)

ツリー形式で目次を表示します。

## キーワード

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118172/23b6ddd5-ecc2-9954-2511-461703d40f1f.png)

キーワード一覧が並んでいます。キーワードから該当するヘルプページに飛べます。

本の最後にある索引のようなものです。chm 作成者が一覧を用意します。

## 検索

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118172/036eae8a-fce7-7a04-d6c5-a060ece69276.png)

任意のキーワードで検索できます。chm 内に含まれるページ数が多くても全体に対して検索でき、素早く結果が返ってきます。

たしか Visual Studio 6.0 には、何百ページ? の印刷したマニュアルと同内容の chm が入っていました。インターネット常時接続ではない時代に、オフラインで全文検索できるというのはとてもありがたかったです。

検索結果のタイトルは `<title>` 要素がそのまま使われます。 Â については後ほど。


## 状況依存のヘルプ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118172/c08c62e2-2a63-a51b-80fb-5db9fbc3b27c.png)

ダイアログで `[F1]` を押すと、ヘルプの中でそのダイアログに関連するページが開きます。たとえばこのように名前変更の方法が分かります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118172/789b940f-a597-dcc4-2b28-421432976f1d.png)

今なら入力フォーム右上の :information_source: アイコンのツールチップで説明を確認できる、くらいの感じだと思います。`[F1]` で何かあるということを、ダイアログは物語っていません。

押しやすい `[F1]` キーがあまり読まないヘルプに割り当てられるのは勿体ないと、今では VS Code のように別の良く使う機能を割り当てているアプリケーションもあります。


# chm を作成する

## HTML Help Workshop 入手

[Microsoft HTML Help Downloads \| Microsoft Learn](https://learn.microsoft.com/en-us/previous-versions/windows/desktop/htmlhelp/microsoft-html-help-downloads) から HTML Help Workshop をダウンロードします。

このページは古く、もう更新されていません。2023/01 時点ではダウンロードリンクが切れています。そうするとマイクロソフト公式から入手できません。

[Wayback Machine](http://web.archive.org/) (Internet Archive) から同ページの過去情報を開いてダウンロードすることは一応できます。Internet Archive は歴史があり、ほかの非公式ダウンロードページに比べると安心です。

## HTML Help Workshop 実行、コンパイル

スタートメニューから起動します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118172/7b65ceaf-1558-9ba4-0909-10d9944937d6.png)

プロジェクトファイル *.hhp を読み込んで、ツールバーの開くボタン右側のコンパイルボタンを押すと chm が作られます。このツールバーのデザインは Windows 98/2000 時代の歴史を感じさせるものです。

これ以上の HTML Help Workshop の使い方は、本記事では扱いません。

## コマンドライン実行

ヘルプファイル更新のたびに HTML Help Workshop を起動するのは手間がかかります。そこで、コマンドライン実行できる方法もあります。 `hhc.exe project.hhp` のように行います。HTML Help Workshop をインストールすると一緒に入ってきます。

hhc.exe, hh.exe, hha.dll の 3つがあれば、HTML Help Workshop をインストールしなくても chm ファイルを作れます。クラウド上で最新の chm ファイルを定期的に作成することもできます。

HTML Help Workshop の UI はあまり使いやすいものではありません。プロジェクトファイルやその他ファイルを別のソフトウェアで作成し、最後に `hhc.exe` を呼び出す、というのもよく行われていました。ヘルプましんなどにお世話になった方も多いと思います。

* [「ヘルプましん」複数のHTMLファイルからCHM形式のヘルプファイル作成 \- 窓の杜](https://forest.watch.impress.co.jp/library/software/helpmachine/)

## 逆コンパイル

chm ファイルは複数の HTML ファイルと設定ファイルをひと固まりにしたものです。HTML Help Workshop から decompile で、元のファイルを取り出せます。 [7\-Zip](https://www.7-zip.org/) でも展開できます。HTML ファイルが文字化けしているときに使うことがあります。

ただし、逆コンパイル結果にプロジェクトファイル hhp は含まれません。一部のファイルを書き換えてもう一度同じような chm を作成することは難しいです。

# 技術情報を辿りたいときは

15年ほど前は、KeiYu HelpLab という HTML Help についての日本語情報がまとまったサイトがありました。とてもお世話になっていました。残念ながらアクセスできなくなってしまいました。 [^1]

[^1]: [Wayback Machine](http://web.archive.org/) に keiyu.com のアーカイブが残っています。

今 HTML Help の技術情報を辿るならこのあたりでしょうか: 

* [Microsoft HTML Help 1\.4 \| Microsoft Learn](https://learn.microsoft.com/ja-jp/previous-versions/windows/desktop/htmlhelp/microsoft-html-help-1-4-sdk) (公式)
* [chmspec](https://chmspec.nongnu.org/) (非公式)

まあ、今 HTML Help の情報が欲しいとすると既存プロジェクトの維持か、ドキュメントを複数形式で出力できるシステムでの一出力形式といったところでしょう。その場合、HTML Help Workshop の使い方はどうでも良くて、コンパイル時に使う主な入力ファイル構成だけおさえていれば十分です。

|拡張子|内部形式|用途、補足|
|---|---|---|
|.hhp|ini|プロジェクトファイル|
|.hhc|HTML|見出しツリーとファイルの対応関係|
|.hhk|HTML|キーワードとファイルの対応関係|
|.html etc.|HTML etc.|ヘルプ本文|
|.h|C++ ヘッダ|状況依存ヘルプとメニュー ID の紐付け|

.hhp, .hhc, .hhk はわりと読み書きしやすい形式です。HTML Help Workshop なしでも、テキストエディターさえあれば編集できます。


# chm を思い出話にしたい理由

chm は、25年前の仕組みとしては画期的だったと思います。しかしあくまで 25年前の仕組みです。当時を振り返ると、

* Windows 98, 2000 の時代
    * 多言語なんて当時ほとんど言われていなかった
        * Windows 98 は Win32API Unicode 系 (W系) がほとんど使えない
        * 多くのアプリケーションがロケール依存で動いていた。マルチバイト文字セット (MBCS, Win32API A系)  
* Internet Explorer 4 の時代
    * WEB 標準なんてなかった
        * いちおう HTML 3.2, HTML 4.0 という言葉はあったものの、Internet Explorer が独自拡張しようとしていた頃
    * HTML を UTF-8 で書くことなんてなかった
    * JavaScript はスクリプトの一つで、あまり主流ではなかった
        * 処理が重くなるので off にしましょうと言っていたころ

はい、HTML は HTML でも、いまの HTML Standard とはまったくの別物です。いま普通に作られたコンテンツを表示しようとするとハマります。


## レンダリングエンジンが Internet Explorer 

Internet Explorer 11 が 2023年2月に完全シャットダウンします。 でもその後も、chm のレンダリングエンジンは Internet Explorer と同じ Trident (MSHTML) のままです。

Internet Explorer がなくなっても、当時と同じ書き方をすることになります。JavaScript ライブラリも Internet Explorer をサポートする古いものを使わないといけません。ライブラリが Internet Explorer をサポートし続ける動機はもうほとんどないでしょう。 

もしマニュアルとして製作者の外部サイトに `<a href="...">` リンクする場合、その先も Internet Explorer サポートを維持し続けないと、表示がおかしなことになります。別ブラウザで開くように `<a href="..." target="_blank">` するのが現実的です。


## UTF-8 で書くと見出しが文字化けする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118172/036eae8a-fce7-7a04-d6c5-a060ece69276.png)

再掲です。この検索結果に Â という謎の文字が現れていました。これは、`<TITLE>` タグの中身を OS のロケールのテキストとして表示するものです。 `<META charset="UTF-8">` していても、気にせず Shift_JIS でタイトルを表示します。 `U+00a0` == nbsp が文字化けして見えます。 [^2]

[^2]: 英語圏のヘルプファイルでは nbsp を見ることがあります。私はコピペしづらくて不便だと思っています。

まあこのように、英語ヘルプで部分的に ASCII でない文字は入っているくらいなら読むことができます。

問題は、日本語 html が UTF-8 で書かれているとき。SHift_JIS としてタイトルを表示します。盛大に文字化けしてなにも分からなくなります。

これを防ごうとすると、chm ファイルを作成する際に、UTF-8 を Shift_JIS に事前に変換するという感じになります。なんだかなあ、です。Shift_JIS が知らない文字を変換しようとしてもできないとか、そうして変換しても Internet Explorer は `<META charset="cp932">` を理解できないので、ツリーは正しく表示できても今度は HTML 表示側が文字化けするとか。 [^3]

[^3]: ms932 や Shift_JIS は理解できるようです。IE がどの charset を知っているかという情報は公式にはないはずです。


## 表示環境と異なるロケールで chm をコンパイルすると正しく動作しない

さらに罠が続きます。chm コンパイル結果は hhc.exe を実行する環境のシステムロケールに依存します。たとえば、英語環境で日本語のヘルプをビルドすると想定通りの結果になりません。日本語の全文検索が効かなくなります。

これ、定期的にビルドしようとするときの障害になります。クラウドでビルドしようにも、日本語 OS という制限が出てきます。日本語だけではなく、まじめに行おうとするとサポートする言語の数だけビルドする OS を用意する必要になるはずです。

Windows XP の時代は、再起動なしにシステムロケールを切り替えた相当でアプリケーションを実行する Microsoft [AppLocale \- Wikipedia](https://en.wikipedia.org/wiki/AppLocale) というソフトがありました。もう公開停止されています。Windows 10 で以前試したことがありますが、このあたりの仕組みが変わっているようで、効きませんでした。

日本語の検索なんてできなくても英語で検索だけできれば十分でしょうという話もあります。でも「正規表現」とか日本語で検索したいこともあると思います。
 
当時の文字列処理の事情からは、全文検索用の辞書ファイルを作るときに OS システムロケールでテキストファイルを開いていそうです。それに、hhp プロジェクトファイルの ini 形式が 16bit 時代のものです。もしかするとファイルが開けない、タイトルの文字化けなどもあるかもしれません。

## HTML Help Workshop の入手が難しい

ダメ押しです。


# 最後に

HTML Help 黎明期からお世話になっていた人としては、感謝しつつも、四半世紀も経つとさすがに無理があるなという感じです。なんとなく動いていて、でもいろいろ問題を抱えている、技術的負債のような。Internet Explorer より長生きしているというのが、もう。

HTML Help を更新したい人はあまりいないはずです。この記事はなんの役にも立たず、ただのネタ的な思い出話としてひっそり埋もれることを期待します。