Blog. Just Blog

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

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

Первый пример, самый простой, это открытие файла справки на заранее известной странице.
  1. ; Сегмент данных
  2. section '.data' data readable writeable
  3. ; CHM-файл
  4. szFile  db 'php_manual_ru.chm',0
  5. ; Адрес страницы внутри скомпилированного CHM-файла
  6. szPage  db 'res/function.http-send-data.html',0
  7. ...
  8.  
  9. ; Сегмент кода
  10. section '.code' code readable executable
  11.         ...
  12.         ; Открыть CHM-файл на заранее известной странице
  13.         invoke  HtmlHelp,NULL,szFile,HH_DISPLAY_TOPIC,szPage
То же самое действие выполняет команда:

hh.exe php_manual_ru.chm::res/function.http-send-data.html
У этого метода есть один большой недостаток. Если в CHM-файле есть индекс, то после выполнения такой команды он останется на самом начале, тогда как правая информационная часть действительно откроется на нужной странице.

Второй пример более сложный. В нем мы будем искать ключевое слово и синхронизировать по нему как информационную часть, так и индекс. Для этого кроме ранее определенных констант нам еще понадобится структура HH_AKLINK:
  1. struct HH_AKLINK
  2.     cbStruct     dd ?   ; sizeof this structure
  3.     fReserved    dd ?   ; must be FALSE (really!)
  4.     pszKeywords  dd ?   ; semi-colon separated keywords
  5.     pszUrl       dd ?   ; URL to jump to if no keywords found (may be NULL)
  6.     pszMsgText   dd ?   ; Message text to display in MessageBox
  7.                         ; if pszUrl is NULL and no keyword match
  8.     pszMsgTitle  dd ?   ; Message text to display in MessageBox
  9.                         ; if pszUrl is NULL and no keyword match
  10.     pszWindow    dd ?   ; Window to display URL in
  11.     fIndexOnFail dd ?   ; Displays index if keyword lookup fails.
  12. ends
  1. ; Сегмент данных
  2. section '.data' data readable writeable
  3. ; CHM-файл
  4. szFile  db 'php_manual_ru.chm',0
  5. ; Ключевое слово
  6. szWord  db 'array_map',0
  7. ; Структура для поиска по ключевому слову
  8. keywords HH_AKLINK
  9. ...
  10.  
  11. ; Сегмент кода
  12. section '.code' code readable executable
  13.         ...
  14.         ; Поиск по ключевому слову
  15.         mov     [keywords.cbStruct],sizeof.HH_AKLINK
  16.         mov     [keywords.pszKeywords],szWord
  17.         mov     [keywords.fReserved],FALSE
  18.         mov     [keywords.fIndexOnFail],TRUE
  19.         mov     [keywords.pszUrl],NULL
  20.         invoke  HtmlHelp,NULL,szFile,HH_KEYWORD_LOOKUP,keywords
  21.  
  22.         ; Хэндл открытого окна справки
  23.         mov     ebx,eax
  24.  
  25.         ; Установить индекс на ключевое слово
  26.         invoke  HtmlHelp,NULL,szFile,HH_DISPLAY_INDEX,szWord
Если файл справки найден и открыт, то функция HtmlHelp в регистре EAX возвращает хэндл его открытого окна. Это позволяет отслеживать момент, когда пользователь закроет окно справки, а также манипулировать окном, например, передвинуть его на самый верх. Обратите внимание на вызов функции HtmlHelp с параметром HH_DISPLAY_INDEX. С его помощью можно устанавливать индекс файла на нужное значение. Так что можно дополнить им первый пример.

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

Пример программы с исходным текстом (FASM)Пример программы с исходным текстом (FASM)

HtmlHelp.Demo.zip (2,960 bytes)


Поделиться ссылкой ВКонтакте Поделиться ссылкой на Facebook Поделиться ссылкой на LiveJournal Поделиться ссылкой в Мой Круг Добавить в Мой мир Добавить на ЛиРу (Liveinternet) Добавить в закладки Memori Добавить в закладки Google
Просмотров: 5647 | Комментариев: 1

Внимание! Статья опубликована больше года назад, информация могла устареть!

Комментарии

Отзывы посетителей сайта о статье
Ret (28.12.2012 в 17:48):
Спасибо за статью!
Cам предпочитаю chm, а всеми любимый NP++ умеет показывать справку по ключевому слову, очень удобно.

Добавить комментарий

Заполните форму для добавления комментария
Имя*:
Текст комментария (не более 2000 символов)*:

*Все поля обязательны для заполнения.
Комментарии, содержащие рекламу, ненормативную лексику, оскорбления и т.п., а также флуд и сообщения не по теме, будут удаляться. Нарушителям может быть заблокирован доступ к сайту.
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2018
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.07 сек. / MySQL: 2 (0.0043 сек.) / Память: 4.75 Mb
Наверх