試験運用中なLinux備忘録・旧記事

はてなダイアリーで公開していた2007年5月-2015年3月の記事を保存しています。

WineでHTML Help Workshopを使用してCHM形式のHTMLヘルプを作成する

(2019/4/6)この記事の内容は古いため、「Wine上のHTML Help Workshopの動作」を参照。

以下、以前の内容となる。

CHM形式にまとめられたHTMLヘルプ(CHM形式)を見るアプリケーション*1はあるが、作成するものは見当たらない。
WindowsではHTML Help Workshopというツールを用いるか、これを利用したヘルプ作成支援ツールと組み合わせてCHM形式のヘルプを作成することになるのだが、今回Wine上でこれを使用できるかどうかについてを確かめてみた。

HTML Help Workshopの入手

http://www.microsoft.com/japan/office/ork/appndx/appa06.mspx
からHTMLHELP.EXEをダウンロードし、実行する。

ファイル情報: HTMLHELP.EXE
項目
ファイルサイズ3,507,384バイト
MD5ffde6013c622c033d31fb892b283a1ce
SHA-1be3ca09da0f21616577c8fb3d3a508804d4f9281

GUIの起動にはmfc40.dllが必要

GUIの実行ファイルはC:\Program Files\HTML Help Workshop\hhw.exeなので、これを実行するのだが、

$ wine "C:\Program Files\HTML Help Workshop\hhw.exe"
err:module:import_dll Library MFC40.DLL (which is needed by L"C:\\Program Files\\HTML Help Workshop\\hhw.exe") not found
err:module:LdrInitializeThunk Main exe initialization for L"C:\\Program Files\\HTML Help Workshop\\hhw.exe" failed, status c0000135

となって起動しない。
要求されているMFC40.DLLWineには用意されていないため、

もしくは

などから入手してC:\windows\system32\などに入れておく。

CHMファイルのコンパイルには一部DLLをWin32ネイティブにする必要がある

以下の「コンパイル」とは、HTMLファイル/目次/インデックスなどのファイルをひとまとめにして圧縮し、CHMファイルを出力する処理を示す。
コンパイルに使用するのはC:\Program Files\HTML Help Workshop\hhc.exeというCLIの実行ファイルで、引数には、CHMファイル作成時の各種ファイルの場所などを記述したプロジェクトファイルの場所を指定する。

何故かファイルが出力できない?

HTML Help Workshopによるヘルプ作成手順は

などを参考にすればよいが、コンパイルを行おうとすると

$ WINEDEBUG= wine "C:\Program Files\HTML Help Workshop\hhc.exe" [プロジェクトファイル].hhp
fixme:itss:ITStorageImpl_SetControlData 0x12b758
HHC5010: Error: Cannot open "z:\(中略)\[出力ファイル].chm". Compilation stopped.

のようにエラーが出てしまう。このエラーは、一般的には
http://www.helixoft.com/images/stories/vsdocman/help/source/trouble2%20hhc5010.htm
などを参考に対処できると思われるが、Wineの場合、itssというライブラリの実装に問題があるっぽい。

$ WINEDEBUG=+itss wine "C:\Program Files\HTML Help Workshop\hhc.exe" [プロジェクトファイル].hhp
trace:itss:DllGetClassObject {5d02926a-212e-11d0-9df9-00a0c922e6ec} {00000001-0000-0000-c000-000000000046} 0x32f308
trace:itss:ITSSCF_CreateInstance (0x7dd68cc0)->((nil),{88cc31de-27ab-11d0-9df9-00a0c922e6ec},0x641b50)
trace:itss:ITSS_create -> 0x12b758
trace:itss:ITStorageImpl_AddRef 0x12b758
fixme:itss:ITStorageImpl_SetControlData 0x12b758
trace:itss:ITStorageImpl_StgCreateDocfile 0x12b758 L"z:\\(中略)\\[出力ファイル名].chm" 18 0 0x641b54
trace:itss:ITSS_StgOpenStorage L"z:\\(中略)\\[出力ファイル名].chm"
HHC5010: Error: Cannot open "z:\\(中略)\\[出力ファイル名].chm". Compilation stopped.
trace:itss:DllCanUnloadNow dll_count = 1

詳しく情報を見るとこのようになった。

itss.dllとitircl.dllをWin32ネイティブに

色々調べてみたところ、この件に関しては
http://bugs.winehq.org/show_bug.cgi?id=7517
にバグ報告がされていて、アプリケーションデータベースのほうではWindowsネイティブ版を使用した回避方法も載っていた(ここのコメントは大変参考になり、感謝)。
Win32なitss.dllitircl.dllに関しては
http://www1.odn.ne.jp/tamura/help/visualbasic/setup05.htm
を参考にするとhhupd.exeという再頒布可能ファイルに含まれているとのことだが、C:\Program Files\HTML Help Workshop\redist\hhupd.exeという場所に既にインストールされていた。
これはインストール時に「This computer already has a newer version of HTML Help.」と出て動作しなかったインストーラで、cabextractなどを用いることで中身を抽出でき、該当ファイル群が得られる。

$ mkdir work; cd work/
$ cabextract ${WINEPREFIX:-~/.wine}"/dosdevices/c:/Program Files/HTML Help Workshop/redist/hhupd.exe"
$ cp itss.dll itircl.dll ${WINEPREFIX:-~/.wine}/dosdevices/c:/windows/system32/
$ cd ../
$ rm work/ -fr

ファイル情報: itss.dll
項目
ファイルサイズ138,048バイト
MD51135040b6f50778f95db194fb47b96e5
SHA-19664968341a6b86b45f0a399fbf73c51a2fb7426
ファイル情報: itircl.dll
項目
ファイルサイズ155,552バイト
MD5270dd719475c004513a83431b97383c5
SHA-15af46a986c2f38cafa75ea8222c969005147911f

infファイルで設定作業を楽に行う

アプリケーションデータベースのやり方では

$ cd ${WINEPREFIX:-~/.wine}/drive_c/windows/system32/
$ wine regsvr32 itss.dll itircl.dll
Successfully registered DLL itss.dll
Successfully registered DLL itircl.dll

という方法でDLLを登録し、更に該当DLLのネイティブ指定の設定をwinecfgなどで設定する必要があるが、下に作成したinfファイルを用いると、DLLの登録とネイティブ版使用の設定をまとめて楽に行える。
[任意]ファイル名: htmlhelp.inf

[Version]
signature="$CHICAGO$"

[DefaultInstall]
AddReg=DllOverrides
RegisterDlls=RegisterDllsSection

[Strings]
DllOverrides="Software\Wine\DllOverrides"

[DllOverrides]
HKCU,%DllOverrides%,"itss",,"native"
HKCU,%DllOverrides%,"itircl",,"native"

[RegisterDllsSection]
11,,itss.dll,1
11,,itircl.dll,1

DLLの登録に関しては/usr/share/wine/wine.infを参考にして記述した。下はこのファイルの適用例。

$ wine rundll32 setupapi.dll,InstallHinfSection DefaultInstall 128 [htmlhelp.infの場所]

関連記事:

動作を確認

ここまでの作業を行うことでコンパイル作業が正常に行えるようになる。日本語のエンコーディングShift_JIS専用など、色々と問題はあるが、有用なツールとして使えそうではある。

使用したバージョン:

  • Wine 0.9.59

*1:xCHMGnoCHMなど