HTML Help Workshop возвращает ошибку после успешно скомпилированного файла.chm
После успешного компиляции файла.chm с помощью HTML Help Workshop я столкнулся с довольно проволочной ошибкой. hhc.exe
,
Я создал документацию моего исходного кода с помощью Doxygen. Doxygen создает, если вы включите GENERATE_HTMLHELP
в файле doxygen:
Если для тега GENERATE_HTMLHELP установлено значение YES, то doxygen генерирует три
дополнительные файлы индекса HTML: index.hhp, index.hhc и index.hhk. Index.hhp
файл проекта, который может быть прочитан HTML Help Workshop от Microsoft (см.:
http://www.microsoft.com/en-us/download/details.aspx?id=21138) в Windows.
После того, как Doxygen создаст эти файлы, я хочу создать файл.chm с помощью HTML Help Workshop. По этой причине я звоню hhc.exe
в CMD. После этого я могу открыть файл.chm, и все выглядит нормально. Но если я прошу CMD для текущего errorlevel
, это выводит:
"C:\Program Files (x86)\HTML Help Workshop\hhc.exe" index.hhp
Microsoft HTML Help Compiler 4.74.8702
Compiling C:\... folder path ...\index.chm
Compile time: 0 minutes, 0 seconds
37 Topics
346 Local links
12 Internet links
0 Graphics
Created C:\... folder path ...\index.chm, 88,740 bytes
Compression decreased file by 194,682 bytes.
echo %errorlevel%
1
Кто-нибудь имеет представление о том, что здесь происходит... и как я могу избежать этой проблемы, что он успешно скомпилирован, но все равно возвращает ошибку? Как я могу выяснить, в чем проблема вместо ошибки "1"?
Проблема в том, что мой сервер сборки (TFS2015) возвращает ошибку, и сборка не удалась.
2 ответа
HTML Help Workshop устанавливается с двумя основными исполняемыми файлами:
hhc.exe
консольная версия HTML-справкиhhw.exe
версия Windows для HTML-компилятора справки
Но компиляция HTML Help Project (hhp) в Compiled HTML (chm) не выполняется напрямую этими двумя исполняемыми файлами.
Оба используют для компиляции hha.dll
- библиотека автора справки HTML - путем вызова экспортированной функции HHA_CompileHHP
,
Экспортируемые функции этой библиотеки:
- EditHhCtrlObject
- EditHhCtrlScript
- FreeFilterDIB
- HHA_CompileHHP
- LoadFilterImage
- LoadJpeg
Насколько я знаю, Microsoft не публиковала ни документации, ни объявлений функций этих функций.
Я полагаю, из некоторых быстрых тестов с hhc.exe
что функция HHA_CompileHHP
имеет BOOL
в качестве типа возврата, который int
и возвращается на успех TRUE
т.е. значение 1
и при неудаче FALSE
т.е. значение 0
, И это выглядит как hhc.exe
использует это возвращаемое значение без инвертирования значения в качестве кода выхода / возврата.
Следовательно errorlevel
является 1
на успех и 0
на провал.
Тесты, которые я сделал, чтобы проверить мое предположение:
Запустите компилятор HTML Help с именем файла проекта, который не существует:
hhc.exe index_1.hhp
Невозможно открыть index_1.hhp.
Код выхода соответственно
errorlevel
равно 0. Это сообщение об ошибке напечатаноhhc.exe
потому что сообщение об ошибке можно найти вhhc.exe
,Установить атрибут файла только для чтения для уже существующего выходного файла
index.chm
и запустите компилятор HTML Help:attrib +r index.chm & hhc.exe index.hhp & attrib -r index.chm
HHC5010: Ошибка: невозможно открыть "C:... путь к папке...\index.chm". Компиляция остановлена.
Код выхода соответственно
errorlevel
равно 0. Это сообщение об ошибке напечатаноhha.dll
потому что это сообщение об ошибке можно найти только вhha.dll
,Переименуйте файл *.htm, явно указанный в
index.hhp
и запустите HTML Help Compiler:ren "file.htm" "renamed file.htm" & hhc.exe index.hhp & ren "renamed file.htm" "file.htm"
Microsoft HTML Help Compiler 4.74.8702
Компиляция C:... путь к папке... \ index.chm
HHC5003: Ошибка: ошибка компиляции при компиляции file.htm.
Следующие файлы не были скомпилированы:
file.htmКод выхода соответственно
errorlevel
равно 0. Это сообщение об ошибке напечатано такжеhha.dll
потому что это сообщение об ошибке можно найти также только вhha.dll
,
Все сообщения об ошибках пишутся для обработки STDOUT, а не для STDERR, как это типично для консольных приложений. Никогда не было другого значения, кроме 0 или 1, назначенного errorlevel
что является причиной, почему я предполагаю, что функция HHA_CompileHHP
возвращает простое логическое значение.
Заключение:
Как обычно, нужно сделать обратное, чтобы оценить успешность / неудачу компиляции справки HTML, например, с помощью командного файла:
"%ProgramFiles(x86)%\HTML Help Workshop\hhc.exe" index.hhp
if not errorlevel 1 exit /B 1
В файле HTML Help Project (*.hhp file) в разделе [OPTIONS]
файл журнала может быть указан с Error log file=...
в который все сообщения выводятся HHA_CompileHHP
написаны дополнительно для печати их в STDOUT.
Но в этом случае, когда Doxygen генерирует файл *.hhp, было бы проще перенаправить STDOUT из пакетного файла в файл журнала, хотя это также не является действительно необходимым, поскольку, скорее всего, Team Foundation Server захватывает сообщения, уже находящиеся в журнале. (У меня не установлен Team Foundation Server.)
HTML Workshop - это программа с графическим интерфейсом. При интерактивном использовании CMD он не ожидает выхода из программ GUI. Поэтому нет кода ошибки.
Echo %errorlevel%
в интерактивном режиме также никогда не будет отображаться код ошибки.
Это двумя способами будет
Dir && Echo Success || Echo Failure
Dir df:\ & Echo %errorlevel%
[См. Мой ответ в разделе Проблемы с переименованием папок и вложенных папок с помощью пакета, чтобы увидеть, что это означает]
Вам нужно будет прочитать документацию HTML Workshop, чтобы увидеть, устанавливает ли он уровень ошибки. Большинство программ с графическим интерфейсом не беспокоит.