成功编译.chm文件后,HTML Help Workshop返回错误

时间:2016-08-18 07:45:37

标签: cmd doxygen html-help-workshop

使用 HTML Help Workshop hhc.exe成功编译.chm文件后,我遇到了严重的线路故障。

我使用 Doxygen 创建了我的源代码文档。如果在doxygen文件中启用GENERATE_HTMLHELP Doxygen 会创建:

  

如果GENERATE_HTMLHELP标记设置为YES,那么doxygen会生成三个   其他HTML索引文件:index.hhp,index.hhc和index.hhk。 index.hhp
  是一个项目文件,可以由Microsoft的HTML帮助研讨会阅读(参见:
  http://www.microsoft.com/en-us/download/details.aspx?id=21138)在Windows上。

Doxygen 创建这些文件后,我想用 HTML Help Workshop 创建.chm文件。因此我在CMD中调用hhc.exe。之后,我可以打开.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)返回错误并且构建失败。

2 个答案:

答案 0 :(得分:6)

HTML Help Workshop 安装了2个主要可执行文件:

  1. hhc.exe是HTML帮助编译器的控制台版本。
  2. hhw.exe是HTML帮助编译器的 Windows GUI版本。
  3. 但HTML帮助项目(hhp)到编译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帮助编译器:

      hhc.exe index_1.hhp
      
        

      无法打开index_1.hhp。

      退出代码errorlevel分别为0.此错误消息由hhc.exe打印,因为错误消息可在hhc.exe中找到。

    2. 在现有输出文件index.chm上设置只读文件属性并运行HTML帮助编译器:

      attrib +r index.chm & hhc.exe index.hhp & attrib -r index.chm
      
        

      HHC5010:错误:无法打开“C:...文件夹路径... \ index.chm”。编译停止了。

      退出代码errorlevel分别为0.此错误消息由hha.dll打印,因为此错误消息只能在hha.dll中找到。

    3. 重命名index.hhp中显式指定的* .htm文件并运行HTML帮助编译器:

      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中找到。

    4. 编写所有错误消息以处理 STDOUT ,而不是 STDERR ,这是控制台应用程序的典型情况。从来没有分配给errorlevel的其他值超过0或1,这就是为什么我认为函数HHA_CompileHHP返回一个简单的布尔值。

      <强>结论:

      必须像往常一样进行评估,以评估HTML帮助编译的成功/失败,例如在批处理文件中使用:

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

      [OPTIONS]部分的HTML帮助项目文件(* .hhp文件)中,可以使用Error log file=...指定日志文件,HHA_CompileHHP输出的所有消息都将被写入 将它们打印到 STDOUT

      但是在这种情况下使用 Doxygen 生成* .hhp文件,将批处理文件中的 STDOUT 重定向到日志文件会更容易,尽管这也不是真的需要因为Team Foundation Server很可能正在将消息捕获到日志中。 (我没有安装Team Foundation Server。)

答案 1 :(得分:0)

HTML Workshop是一个GUI程序。以交互方式使用CMD时,它不会等待GUI程序退出。因此没有错误代码。

Echo %errorlevel%以交互方式永远不会显示错误代码。

这两种方式

Dir && Echo Success || Echo Failure

Dir df:\ & Echo %errorlevel%

[请参阅Trouble with renaming folders and sub folders using Batch的答案,了解其含义]

您必须阅读HTML Workshop的文档,看它是否设置了错误级别。大多数GUI程序都不会打扰。