Создание CHM-файлов с помощью Delphi

В последнее время очень популярным форматом справочной документации и электронных книг стал формат CHM. Это связано с удобством этого формата по сравнению с форматом HLP, а также с продвижением этого формата самой MICROSOFT. В данной статье, я хочу рассказать, как создать файлы справки CHM с помощью программ, написанных на Delphi, но без помощи таких общеизвестных утилит, как hhc.exe и hha.dll.

Способ первый: С помощью компоненты TCHMFile


TCHMFile – это единственная VCL компонента для компиляции и декомпиляции нескольких HTML документов в один CHM-файл.

Разберём процесс компиляции CHM документа на примере следующего кода: 
procedure Compile;
var
  F: TChmFile;
begin
  F := TChmFile.Create(c:\test.chm, omCreateWrite);
  with TChmHeader.Create do
  begin
  Toolbar := True;
  ToolbarCaptions :=True;
  Buttons := [cbHome, cbBack];
  Title := Test;
  Default file := index.htm;
  TocFile := Table of Contents.hhc;
  IndexFile := Ind.hhk;
  PaneVisible := True;
  PaneTocTab := True;
  PaneFavTab := True;
  PaneIndexTab := True;
  PaneTabPos := ctpTop;
  WndName:=main;
  PaneWidth:=200;
  Left:=100;
  Top:=100;
  Height:=500;
  Width:=800;
  Write(F);
  Free;
  end;
  F.AddFile(index.htm, C:\test\index.htm);
  F.AddFile(images\pic.jpg, C:\test\images\pic.jpg);
  F.Free;
end. 

Эта процедура создаёт CHM-файл, путь которого c:\test.chm, а его свойства устанавливаются с помощью TChmHeader: 
Toolbar – параметр, с помощью которого в CHM-файле показывается панель управления; 
ToolbarCaptions – параметр, указывающий, что необходимо отображать подписи к кнопкам; 
Buttons – здесь указываются кнопки, которые будут отображаться на панели управления. Возможные варианты кнопок: cbExpand (Скрыть), cbBack (Назад), cbForward (Далее), cbStop (Остановить), cbRefresh (Обновить), cbHome (Домашняя страница), cbZoom (Размер), cbOptions (Параметры), cbPrint (Печать), cbJump1 (Первая пользовательская кнопка), cbJump2 (Вторая пользовательская кнопка); 
Title – название справочной системы, которое будет отображаться в заголовке главного окна; 
Default file – имя страницы по умолчанию, которая открывается сразу после загрузки файла; 
TocFile – имя файла Содержания справочной системы; 
IndexFile – имя файла Индекса справочной системы; 
PaneVisible – параметр, указывающий отображать панели; 
PaneTocTab – параметр, указывающий на создание панели Содержание; 
PaneFavTab – параметр, указывающий на создание панели Избранное; 
PaneIndexTab – параметр, указывающий на создание панели Указатель; 
PaneTabPos – местоположение вкладок на панели навигации. Возможные варианты: ctpTop (Сверху), ctpLeft (Слева), ctpBottom (Снизу); 

Свойства главного окна: 
WndName – название окна, в котором откроется справка во время просмотра. Желательно задавать значение main; 
PaneWidth – ширина навигационной панели в пикселях (по умолчанию это значение равно 250); 
Left – положение главного окна справки слева, указывается в пикселях; 
Top – положение главного окна справки сверху, указывается в пикселях; 
Height – высота главного окна справки, указывается в пикселях; 
Width – ширина главного окна справки, указывается в пикселях; 

Далее идёт процесс записи файла на диск (собственно создание файла CHM) и добавление в справочную систему всех необходимых файлов (HTML документов, рисунков, относящихся к этим документам и др.). 
Способ второй: С помощью динамической библиотеки kkyyhhd.dll

kkyyhhd.dll была найдена мною на просторах интернета. Для компиляции справки CHM Вам понадобится файл проекта (HHP). Обычно этот формат выглядит так: 
[OPTIONS] 
Compatibility=1.1 or later 
Compiled file=Справка.chm 
Contents file=Table of Contents.hhc 
Default window=main 
Default topic=index.htm
Full-text search=Yes
Index file=Ind.hhk
Language=0x419 Русский 

[WINDOWS] 
main=Название,Table of Contentc.hhc,Ind.hhk,index.htm,home.htm,,,,,132128,200,8198,[119,78,769,534],0,0,,,,1,0 

[FILES] 
C:\test\index.htm 
C:\test\home.htm
C:\test\lis1.htm 

Чтобы создать файл CHM необходимо выполнить следующий код в Вашей программе: 
procedure AddLog(Memo: TMemo; SStr: PChar; Addn:bool=false);
begin
  Memo.Text := Memo.Text + SStr;
  if Addn then Memo.Text := Memo.Text + #13#10;
end; 

procedure pLogString(pMsg: PChar); stdcall;
begin
  AddLog(Form1.Memo1,pMsg);
end; 

function pProgress(pFile: PChar):bool; stdcall;
begin
  AddLog(Form1.Memo2,pFile,true);
  Result := True;
end; 

procedure TForm1.Button1Click(Sender: TObject);
var
  Had: HWND;
  hhp: function(pszHhpFile: PCHAR; pLogString: Pointer; pProgress: Pointer):bool;stdcall;
begin
  Had := LoadLibrary(kkyyhhd.dll);
  if Had <> 0 then
  begin
  @hhp := GetProcAddress(Had, CompileHHP);
  if @hhp <> nil then
  hhp(PCHAR(Путь к файлу HHP),@pLogString,@pProgress);
  FreeLibrary(Had);
  end;
end; 

При этом в папке с файлом проекта HHP появится справка CHM, а в самой программе в TMemo Вы увидите детальный log, примерно такой же как в программе Microsoft HTML Help Workshop.

На этом пожалуй всё. Надеюсь эта статья многим поможет быстро создавать и использовать документацию в формате CHM.