使用 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)返回错误并且构建失败。
答案 0 :(得分:6)
HTML Help Workshop 安装了2个主要可执行文件:
hhc.exe
是HTML帮助编译器的控制台版本。hhw.exe
是HTML帮助编译器的 Windows GUI版本。但HTML帮助项目(hhp)到编译HTML(chm)的编译不是由这两个可执行文件直接完成的。
两者都用于编译hha.dll
- HTML帮助作者库 - 通过调用导出的函数HHA_CompileHHP
。
此库的导出功能是:
据我所知,Microsoft尚未发布任何文档或这些函数的函数声明。
我假设来自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帮助编译器:
attrib +r index.chm & hhc.exe index.hhp & attrib -r index.chm
HHC5010:错误:无法打开“C:...文件夹路径... \ index.chm”。编译停止了。
退出代码errorlevel
分别为0.此错误消息由hha.dll
打印,因为此错误消息只能在hha.dll
中找到。
重命名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
中找到。
编写所有错误消息以处理 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程序都不会打扰。