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]