14 February 2012

(Visual C++/MFC) WinHelpからHtmlHelp(.chm)への移行

Microsoft Visual C++で過去に製作していたWinHelp(Windows Help、拡張子 *.hlp)形式のコンテキスト・ヘルプを実装したアプリケーションを、HtmlHelp(拡張子 *.chm)を用いた方式に変換する方法のメモ

■ Microsoftによる情報

Visual Studio付属のヘルプ

既存の MFC アプリケーションへの HTML ヘルプ形式の状況依存のヘルプの追加

によれば …

1) Visual StudioでダミーのMFC, HtmlHelp対応アプリケーションを作成する

その作成したダミーアプリケーションから

2) hlpディレクトリ(に含まれる) HtmlHelpソースコード ファイルを丸ごとコピー
3) ソリューションのプロジェクトファイル *.vcproj のヘルプ関連の設定をコピー
 3-1) ヘッダー ファイル設定の中で、.\Resource.h の処理設定をコピー
      出力ファイルは hlp\HTMLDefines.h
 3-2) HTML ヘルプ ファイル のセクションの処理設定をコピー
4) コンストラクタにEnableHtmlHelp();を記述


■ hlpディレクトリのコピーすべきファイル一覧


2012/02/14 07:29 472 HIDD_ROOT_DIALOG.htm
2012/02/14 07:29 11,093 TestApp.chm
2012/02/14 07:29 678 TestApp.hhc
2012/02/14 07:29 203 TestApp.hhk
2012/02/14 07:29 414 TestApp.hhp

■ vcprojファイル中の ヘッダー ファイル設定の中で、.\Resource.h の処理設定

Resource.h を HTMLDefines.hとTestApp.HHP に変換するコマンドがずらっと書かれている。TestApp というアプリケーションファイル名は適宜読み替えること

TestApp.vcproj

<Filter
Name="ヘッダー ファイル"
Filter="h;hpp;hxx;hm;inl;inc;xsd"
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
<File
RelativePath=".\Resource.h">
<FileConfiguration
Name="Debug|Win32">
<Tool
Name="VCCustomBuildTool"
Description="ヘルプ コンパイラ用のマップ ファイルを生成しています..."
CommandLine="echo // 生成されたマップ ファイルです。次で使用されます。TestApp.HHP. &gt; &quot;hlp\HTMLDefines.h&quot;
echo. &gt; &quot;hlp\HTMLDefines.h&quot;
echo // コマンド (ID_* and IDM_*) &gt;&gt; &quot;hlp\HTMLDefines.h&quot;
makehm /h ID_,HID_,0x10000 IDM_,HIDM_,0x10000 &quot;$(InputFileName)&quot; &gt;&gt; &quot;hlp\HTMLDefines.h&quot;
echo. &gt;&gt; &quot;hlp\HTMLDefines.h&quot;
echo // プロンプト (IDP_*) &gt;&gt; &quot;hlp\HTMLDefines.h&quot;
makehm /h IDP_,HIDP_,0x30000 &quot;$(InputFileName)&quot; &gt;&gt; &quot;hlp\HTMLDefines.h&quot;
echo. &gt;&gt; &quot;hlp\HTMLDefines.h&quot;
echo // リソース (IDR_*) &gt;&gt; &quot;hlp\HTMLDefines.h&quot;
makehm /h IDR_,HIDR_,0x20000 &quot;$(InputFileName)&quot; &gt;&gt; &quot;hlp\HTMLDefines.h&quot;
echo. &gt;&gt; &quot;hlp\HTMLDefines.h&quot;
echo // ダイアログ (IDD_*) &gt;&gt; &quot;hlp\HTMLDefines.h&quot;
makehm /h IDD_,HIDD_,0x20000 &quot;$(InputFileName)&quot; &gt;&gt; &quot;hlp\HTMLDefines.h&quot;
echo. &gt;&gt; &quot;hlp\HTMLDefines.h&quot;
echo // フレーム コントロール (IDW_*) &gt;&gt; &quot;hlp\HTMLDefines.h&quot;
makehm /h /a afxhh.h IDW_,HIDW_,0x50000 &quot;$(InputFileName)&quot; &gt;&gt; &quot;hlp\HTMLDefines.h&quot;
"
Outputs="hlp\HTMLDefines.h"/>
</FileConfiguration>
<FileConfiguration
Name="Release|Win32">
<Tool
Name="VCCustomBuildTool"
Description="ヘルプ コンパイラ用のマップ ファイルを生成しています..."
CommandLine="echo // 生成されたマップ ファイルです。次で使用されます。TestApp.HHP. &gt; &quot;hlp\HTMLDefines.h&quot;
echo. &gt; &quot;hlp\HTMLDefines.h&quot;
echo // コマンド (ID_* and IDM_*) &gt;&gt; &quot;hlp\HTMLDefines.h&quot;
makehm /h ID_,HID_,0x10000 IDM_,HIDM_,0x10000 &quot;$(InputFileName)&quot; &gt;&gt; &quot;hlp\HTMLDefines.h&quot;
echo. &gt;&gt; &quot;hlp\HTMLDefines.h&quot;
echo // プロンプト (IDP_*) &gt;&gt; &quot;hlp\HTMLDefines.h&quot;
makehm /h IDP_,HIDP_,0x30000 &quot;$(InputFileName)&quot; &gt;&gt; &quot;hlp\HTMLDefines.h&quot;
echo. &gt;&gt; &quot;hlp\HTMLDefines.h&quot;
echo // リソース (IDR_*) &gt;&gt; &quot;hlp\HTMLDefines.h&quot;
makehm /h IDR_,HIDR_,0x20000 &quot;$(InputFileName)&quot; &gt;&gt; &quot;hlp\HTMLDefines.h&quot;
echo. &gt;&gt; &quot;hlp\HTMLDefines.h&quot;
echo // ダイアログ (IDD_*) &gt;&gt; &quot;hlp\HTMLDefines.h&quot;
makehm /h IDD_,HIDD_,0x20000 &quot;$(InputFileName)&quot; &gt;&gt; &quot;hlp\HTMLDefines.h&quot;
echo. &gt;&gt; &quot;hlp\HTMLDefines.h&quot;
echo // フレーム コントロール (IDW_*) &gt;&gt; &quot;hlp\HTMLDefines.h&quot;
makehm /h /a afxhh.h IDW_,HIDW_,0x50000 &quot;$(InputFileName)&quot; &gt;&gt; &quot;hlp\HTMLDefines.h&quot;
"
Outputs="hlp\HTMLDefines.h"/>
</FileConfiguration>
</File>

<File
RelativePath=".\stdafx.h">
</File>
<File
RelativePath=".\TestApp.h">
</File>
<File
RelativePath=".\TestAppDlg.h">
</File>
</Filter>

■ vcprojファイル中の ヘッダー ファイル設定の中で、ヘルプファイルの処理設定

TestApp.vcproj

<Filter
Name="HTML ヘルプ ファイル"
Filter="hhp;hhc;hhk;gif;jpg">
<File
RelativePath=".\hlp\TestApp.hhc">
</File>
<File
RelativePath=".\hlp\TestApp.hhk">
</File>
<File
RelativePath=".\hlp\TestApp.hhp">
<FileConfiguration
Name="Debug|Win32">
<Tool
Name="VCCustomBuildTool"
Description="ヘルプ ファイルを作成しています..."
CommandLine="start /wait hhc &quot;hlp\TestApp.hhp&quot;
if not exist &quot;hlp\TestApp.chm&quot; goto :HelpError
copy &quot;hlp\TestApp.chm&quot; &quot;$(OutDir)\TestApp.chm&quot;
goto :HelpDone
:HelpError
echo hlp\TestApp.hhp(1) : error:ヘルプ ファイルを作成中に問題が発生しました。
echo.
:HelpDone
echo.
"
AdditionalDependencies="hlp\HTMLDefines.h"
Outputs="$(OutDir)\$(ProjectName).chm"/>
</FileConfiguration>
<FileConfiguration
Name="Release|Win32">
<Tool
Name="VCCustomBuildTool"
Description="ヘルプ ファイルを作成しています..."
CommandLine="start /wait hhc &quot;hlp\TestApp.hhp&quot;
if not exist &quot;hlp\TestApp.chm&quot; goto :HelpError
copy &quot;hlp\TestApp.chm&quot; &quot;$(OutDir)\TestApp.chm&quot;
goto :HelpDone
:HelpError
echo hlp\TestApp.hhp(1) : error:ヘルプ ファイルを作成中に問題が発生しました。
echo.
:HelpDone
echo.
"
AdditionalDependencies="hlp\HTMLDefines.h"
Outputs="$(OutDir)\$(ProjectName).chm"/>
</FileConfiguration>
</File>

</Filter>
<Filter
Name="HTML ヘルプ トピック"
Filter="htm;html">
<File
RelativePath=".\hlp\HIDD_ROOT_DIALOG.htm"
DeploymentContent="TRUE">
</File>

</Filter>
<File
RelativePath=".\ReadMe.txt">
</File>
<File
RelativePath=".\res\TestApp.manifest">
</File>

■ コンストラクタにEnableHtmlHelp();を記述


// CTestAppApp コンストラクション

CTestAppApp::CTestAppApp()
{
EnableHtmlHelp();

// TODO: この位置に構築用コードを追加してください。
// ここに InitInstance 中の重要な初期化処理をすべて記述してください。
}


■ ヘルプ プロジェクト ファイルのメッセージマップを必要により追加

hlp/TestApp.hpp

[OPTIONS]
Compatibility=1.1 or later
Compiled file=TestApp.chm
Contents file=TestApp.hhc
Index file=TestApp.hhk
Default Window=WndMain
Default topic=index.html
Display compile progress=No
Language=0x411 日本語

[FILES]
HIDD_ROOT_DIALOG.htm
001-page.html
002-page.html


[ALIAS]
HIDD_COMPDEL_DIALOG=HIDD_ROOT_DIALOG.htm
HIDD_DLG_001_PAGE=001-page.html
HIDD_DLG_002_PAGE=002-page.html


[MAP]
#include HTMLDefines.h

[INFOTYPES]