在《C#生成CHM文件》一系列中,我们是以微软自带的hhc.exe来编译CHM文件的,这样有一个弊端就是当我们的机器里面并没有装hhc.exe就会报错,这通常在盗版的Windows系统比较常见,而正版的windows会默认帮我们安装hhc.exe,一般的默认路径是C:\Program Files\HTML Help Workshop或者C:\Program Files(X86)\HTML Help Workshop。

为了解决这个问题,我们可以使用hha.dll来编译CHM文件,这也是许多CHM生成软件这样做的。

网上关于hha.dll的资料比较少,因为微软并没有公布hha.dll的函数,不过还是有几个牛人将函数给我们弄出来了,比如“夜闻香”,本文是在此基础上做的。

实际上其CHM项目编译器的HHA.DLL中提供了名为HHA_CompileHPP的导出函数,实现了对.hpp的CHM项目文件直接进行编译,并通过两个回调函数通知用户当前编译进度。

下面是HHA_CompileHPP的原型

BOOL WINAPI HHA_CompileHHP(PCSTR pszHhpFile, FARPROC pLogString, FARPROC pProgress, INT nRes);

我们可以使用DllImport来调用hha.dll中的函数.

主要的代码如下:

 
  
  1. string log1;  
  2.         string log2;  
  3.  
  4.         delegate bool GetInfo(string log);  
  5.  
  6.         //编译信息  
  7.         public bool GetInfo1(string log)  
  8.         {  
  9.             log1 = log;  
  10.             return true;  
  11.         }  
  12.  
  13.         //进度信息  
  14.         public bool GetInfo2(string log)  
  15.         {  
  16.             log2 = log;  
  17.             return true;  
  18.         }  
  19.  
  20.         [DllImport("hha.dll")]  
  21.         private extern static void HHA_CompileHHP(string hhpFile, GetInfo g1, GetInfo g2, int stack);  
  22.  
  23.         public void Compile()  
  24.         {  
  25.             using (OpenFileDialog ofd=new OpenFileDialog())  
  26.             {  
  27.                 ofd.Filter = "CHM项目文件|*.hhp";  
  28.                 ofd.ShowDialog();  
  29.                 if (ofd.FileName!="")  
  30.                 {  
  31.                     HHA_CompileHHP(ofd.FileName, GetInfo1, GetInfo2, 0);  
  32.                     MessageBox.Show("编译成功");  
  33.                 }  
  34.             }  
  35.         } 

为了简单方便,我们这里是直接编译已经生生成的hhp文件(可以使用alexiseditor的设置选项,去掉“删除临时文件”来获得),有兴趣的朋友可以更加深入,比如获得编译进度信息,显示编译进度等等。。。。

代码是AlexisEditor项目下的HhaForm.cs 

源码分包1源码分包2