Работа с файлами справки CHM на Ассемблере

Когда речь заходит о работе с файлами справки в формате CHM, то обычно все ссылаются на системный файл hh.exe, который вызывают с различными параметрами. Действительно, с его помощью можно просто открывать файл справки, а также открывать его на нужной странице (при условии, что заранее известно наименование ее HTML-файла в составе скомпилированной справки). Но с помощью hh.exe невозможно воспользоваться таким мощным инструментом, как поиск по ключевым словам. В этом случае мы можем воспользоваться всей мощью WinAPI и задействовать функцию HtmlHelp, которая находится в системной библиотеке HHCtrl.ocx. К сожалению, информации по ее использованию даже на MSDN очень мало, пришлось самостоятельно разбираться с некоторыми моментами. Для работы нам понадобятся определения некоторых констант:
HH_DISPLAY_TOPIC  = 00h ; Открыть страницу в файле справки
HH_DISPLAY_INDEX  = 02h ; Установить индекс на ключевое слово
HH_KEYWORD_LOOKUP = 0Dh ; Поиск ключевого слова
HH_CLOSE_ALL      = 12h ; Закрыть все открытые окна справки

Остальные константы вы можете посмотреть в MSDN, но для нормальной работы с файлом справки вполне достаточно этих четырех. Во всех примерах этой статьи я ссылаюсь на файл справки PHP php_manual_ru.chm, его можно скачать здесь (примерно 13 мегабайт). В ваших программах, естественно, вы будете использовать свой файл справки.

Первый пример, самый простой, это открытие файла справки на заранее известной странице.
; Сегмент данных
section '.data' data readable writeable
; CHM-файл
szFile  db 'php_manual_ru.chm',0
; Адрес страницы внутри скомпилированного CHM-файла
szPage  db 'res/function.http-send-data.html',0
...
 
; Сегмент кода
section '.code' code readable executable
        ...
        ; Открыть CHM-файл на заранее известной странице
        invoke  HtmlHelp,NULL,szFile,HH_DISPLAY_TOPIC,szPage

То же самое действие выполняет команда:
hh.exe php_manual_ru.chm::res/function.http-send-data.html

У этого метода есть один большой недостаток. Если в CHM-файле есть индекс, то после выполнения такой команды он останется на самом начале, тогда как правая информационная часть действительно откроется на нужной странице.

Второй пример более сложный. В нем мы будем искать ключевое слово и синхронизировать по нему как информационную часть, так и индекс. Для этого кроме ранее определенных констант нам еще понадобится структура HH_AKLINK:
struct HH_AKLINK
    cbStruct     dd ?   ; sizeof this structure
    fReserved    dd ?   ; must be FALSE (really!)
    pszKeywords  dd ?   ; semi-colon separated keywords
    pszUrl       dd ?   ; URL to jump to if no keywords found (may be NULL)
    pszMsgText   dd ?   ; Message text to display in MessageBox
                        ; if pszUrl is NULL and no keyword match
    pszMsgTitle  dd ?   ; Message text to display in MessageBox
                        ; if pszUrl is NULL and no keyword match
    pszWindow    dd ?   ; Window to display URL in
    fIndexOnFail dd ?   ; Displays index if keyword lookup fails.
ends

; Сегмент данных
section '.data' data readable writeable
; CHM-файл
szFile  db 'php_manual_ru.chm',0
; Ключевое слово
szWord  db 'array_map',0
; Структура для поиска по ключевому слову
keywords HH_AKLINK
...
 
; Сегмент кода
section '.code' code readable executable
        ...
        ; Поиск по ключевому слову
        mov     [keywords.cbStruct],sizeof.HH_AKLINK
        mov     [keywords.pszKeywords],szWord
        mov     [keywords.fReserved],FALSE
        mov     [keywords.fIndexOnFail],TRUE
        mov     [keywords.pszUrl],NULL
        invoke  HtmlHelp,NULL,szFile,HH_KEYWORD_LOOKUP,keywords
 
        ; Хэндл открытого окна справки
        mov     ebx,eax
 
        ; Установить индекс на ключевое слово
        invoke  HtmlHelp,NULL,szFile,HH_DISPLAY_INDEX,szWord

Если файл справки найден и открыт, то функция HtmlHelp в регистре EAX возвращает хэндл его открытого окна. Это позволяет отслеживать момент, когда пользователь закроет окно справки, а также манипулировать окном, например, передвинуть его на самый верх. Обратите внимание на вызов функции HtmlHelp с параметром HH_DISPLAY_INDEX. С его помощью можно устанавливать индекс файла на нужное значение. Так что можно дополнить им первый пример.

Одно приложение через HtmlHelp может открыть одновременно только одно окно справки. Даже если попробовать последовательно открыть разные файлы справки, то все равно сперва будет закрыто предыдущее окно, и только потом открыто новое. С чем связано такое ограничение - не знаю. Также вы можете закрыть окно справки из вашего приложения, для этого воспользуйтесь следующей командой:
        ; Закрыть все открытые окна справки
        invoke  HtmlHelp,NULL,NULL,HH_CLOSE_ALL,NULL

В приложении пример программы с исходным текстом для работы с файлом справки php_manual_ru.chm, открывающей его на нужном ключевом слове или заранее известной странице. CHM-файл должен находиться в одной папке с программой.
Добавлено: 13 Сентября 2013 05:52:27 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...