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をダウンロードし、実行する。
項目 | 値 |
---|---|
ファイルサイズ | 3,507,384バイト |
MD5 | ffde6013c622c033d31fb892b283a1ce |
SHA-1 | be3ca09da0f21616577c8fb3d3a508804d4f9281 |
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.DLLはWineには用意されていないため、
- http://www.cmt.phys.kyushu-u.ac.jp/~M.Sakurai/prog/index.html
- http://www.freem.ne.jp/contents/begin/run.html
もしくは
- http://www.vector.co.jp/soft/win95/net/se105525.html
- http://www.vector.co.jp/soft/win95/util/se101531.html
などから入手して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.dllとitircl.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
項目 | 値 |
---|---|
ファイルサイズ | 138,048バイト |
MD5 | 1135040b6f50778f95db194fb47b96e5 |
SHA-1 | 9664968341a6b86b45f0a399fbf73c51a2fb7426 |
項目 | 値 |
---|---|
ファイルサイズ | 155,552バイト |
MD5 | 270dd719475c004513a83431b97383c5 |
SHA-1 | 5af46a986c2f38cafa75ea8222c969005147911f |
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:xCHMやGnoCHMなど