Работа с файлами справки CHM на Ассемблере
Когда речь заходит о работе с файлами справки в формате CHM, то обычно все ссылаются на системный файл hh.exe, который вызывают с различными параметрами. Действительно, с его помощью можно просто открывать файл справки, а также открывать его на нужной странице (при условии, что заранее известно наименование ее HTML-файла в составе скомпилированной справки). Но с помощью hh.exe невозможно воспользоваться таким мощным инструментом, как поиск по ключевым словам. В этом случае мы можем воспользоваться всей мощью WinAPI и задействовать функцию HtmlHelp, которая находится в системной библиотеке HHCtrl.ocx. К сожалению, информации по ее использованию даже на MSDN очень мало, пришлось самостоятельно разбираться с некоторыми моментами. Для работы нам понадобятся определения некоторых констант:Code (Assembler) : Убрать нумерацию
- HH_DISPLAY_TOPIC = 00h ; Открыть страницу в файле справки
- HH_DISPLAY_INDEX = 02h ; Установить индекс на ключевое слово
- HH_KEYWORD_LOOKUP = 0Dh ; Поиск ключевого слова
- HH_CLOSE_ALL = 12h ; Закрыть все открытые окна справки
Первый пример, самый простой, это открытие файла справки на заранее известной странице.
Code (Assembler) : Убрать нумерацию
- ; Сегмент данных
- 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:
Code (Assembler) : Убрать нумерацию
- 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
Code (Assembler) : Убрать нумерацию
- ; Сегмент данных
- 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 может открыть одновременно только одно окно справки. Даже если попробовать последовательно открыть разные файлы справки, то все равно сперва будет закрыто предыдущее окно, и только потом открыто новое. С чем связано такое ограничение - не знаю. Также вы можете закрыть окно справки из вашего приложения, для этого воспользуйтесь следующей командой:
Code (Assembler) : Убрать нумерацию
- ; Закрыть все открытые окна справки
- invoke HtmlHelp,NULL,NULL,HH_CLOSE_ALL,NULL
Просмотров: 7097 | Комментариев: 1
Метки: Assembler, файлы справки
Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
Добавить комментарий
Заполните форму для добавления комментария
Cам предпочитаю chm, а всеми любимый NP++ умеет показывать справку по ключевому слову, очень удобно.