Среда 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
это файл проекта, который можно прочитать с помощью справки по Microsoft HTML Help (см.:
http://www.microsoft.com/en-us/download/details.aspx?id=21138) в Windows.

После того, как Doxygen создает эти файлы, я хочу создать файл .chm с помощью справки по HTML. По этой причине я вызываю 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

Есть ли у кого-нибудь представление о том, что h... здесь не так, и как я могу избежать этой проблемы, которую он скомпилировал успешно, но все же возвращает ошибку? Как я могу выяснить, что проблема вместо ошибки "1"?

Проблема в том, что мой сервер сборки (TFS2015) возвращает ошибку, и сборка не выполнена.

Ответ 1

HTML Help Workshop установлен с двумя основными исполняемыми файлами:

  • hhc.exe - это консольная версия компилятора HTML-справки.
  • hhw.exe - это Windows графический интерфейс HTML-компилятора HTML.

Однако компиляция HTML-проекта справки (hhp) для скомпилированного HTML (chm) напрямую не выполняется этими двумя исполняемыми файлами.

Оба используются для компиляции hha.dll - библиотеки HTML Help Help - путем вызова экспортируемой функции HHA_CompileHHP.

Экспортируемые функции этой библиотеки:

  • EditHhCtrlObject
  • EditHhCtrlScript
  • FreeFilterDIB
  • HHA_CompileHHP
  • LoadFilterImage
  • LoadJpeg

Корпорация Майкрософт не опубликовала ни одной документации или деклараций функций этих функций, насколько мне известно.

I предположим из некоторых быстрых тестов с hhc.exe, что функция HHA_CompileHHP имеет BOOL как возвращаемый тип, который равен int и возвращает успех TRUE, то есть значение 1 и при отказе FALSE, т.е. значение 0. И похоже, что hhc.exe использует это возвращаемое значение без инвертирования значения как код выхода/возврата.

Следовательно, errorlevel является 1 при успехе и 0 при неудаче.

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

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

    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:... path path...\index.chm". Компиляция остановлена.

    Код выхода, соответственно errorlevel равен 0. Это сообщение об ошибке печатается hha.dll, потому что это сообщение об ошибке можно найти только в hha.dll.

  • Переименуйте файл *.htm, явно указанный в index.hhp, и запустите компилятор HTML Help:

    ren "file.htm" "renamed file.htm" & hhc.exe index.hhp & ren "renamed file.htm" "file.htm"
    

    Компилятор справки Microsoft HTML 4.74.8702

    Компиляция C:... путь к папке... \index.chm

    HHC5003: Ошибка: компиляция завершилась неудачей при компиляции файла file.htm.

    Следующие файлы не были скомпилированы:
    file.htm

    Код выхода, соответственно errorlevel равен 0. Это сообщение об ошибке также печатается на hha.dll, потому что это сообщение об ошибке может быть найдено также только в hha.dll.

Все сообщения об ошибках записываются для обработки STDOUT, а не STDERR, как это типично для консольных приложений. Для errorlevel никогда не было другого значения, кроме 0 или 1, поэтому я полагаю, что функция HHA_CompileHHP возвращает простое логическое значение.

Вывод:

Противоположное, как обычно, должно быть сделано для оценки успеха/неудачи компиляции HTML-справки, например, с использованием в пакетном файле:

"%ProgramFiles(x86)%\HTML Help Workshop\hhc.exe" index.hhp
if not errorlevel 1 exit /B 1

В файле проекта справки HTML (файл *.hhp) в разделе [OPTIONS] файл журнала может быть указан с помощью Error log file=..., в который все сообщения, выводимые HHA_CompileHHP, записываются дополнительно на печать их STDOUT.

Но в этом случае с Doxygen, генерирующим файл *.hhp, было бы проще перенаправить STDOUT в пакетном файле в файл журнала, хотя это также не очень необходимо, потому что, скорее всего, Team Foundation Сервер фиксирует сообщения уже в журнале. (У меня нет Team Foundation Server.)

Ответ 2

HTML Workshop - это программа GUI. При интерактивном использовании CMD он не ждет выхода программ GUI. Поэтому код ошибки отсутствует.

Echo %errorlevel% в интерактивном режиме никогда не будет отображаться код ошибки.

Эти два пути будут

Dir && Echo Success || Echo Failure

Dir df:\ & Echo %errorlevel%

[См. мой ответ в Проблема с переименованием папок и подпапок с помощью Batch, чтобы увидеть, что это значит]

Вам нужно будет прочитать документацию HTML Workshop, чтобы узнать, задает ли он уровень ошибок. Большинство программ GUI не беспокоят.