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 устанавливается с двумя основными исполняемыми файлами:

  1. hhc.exe консольная версия HTML-справки
  2. 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 на провал.

Тесты, которые я сделал, чтобы проверить мое предположение:

  1. Запустите компилятор HTML Help с именем файла проекта, который не существует:

    hhc.exe index_1.hhp
    

    Невозможно открыть index_1.hhp.

    Код выхода соответственно errorlevel равно 0. Это сообщение об ошибке напечатано hhc.exe потому что сообщение об ошибке можно найти в hhc.exe,

  2. Установить атрибут файла только для чтения для уже существующего выходного файла 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,

  3. Переименуйте файл *.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, чтобы увидеть, устанавливает ли он уровень ошибки. Большинство программ с графическим интерфейсом не беспокоит.

Другие вопросы по тегам