C#生成CHM文件(外篇使用hha.dll)

在《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中的函数.

主要的代码如下:

 

复制代码
代码
 string log1;
        
string log2;

        
delegate bool GetInfo(string log);

        
//编译信息
        public bool GetInfo1(string log)
        {
            log1 
= log;
            
return true;
        }

        
//进度信息
        public bool GetInfo2(string log)
        {
            log2 
= log;
            
return true;
        }

        [DllImport(
"hha.dll")]
        
private extern static void HHA_CompileHHP(string hhpFile, GetInfo g1, GetInfo g2, int stack);

        
public void Compile()
        {
            
using (OpenFileDialog ofd=new OpenFileDialog())
            {
                ofd.Filter 
= "CHM项目文件|*.hhp";
                ofd.ShowDialog();
                
if (ofd.FileName!="")
                {
                    HHA_CompileHHP(ofd.FileName, GetInfo1, GetInfo2, 
0);
                    MessageBox.Show(
"编译成功");
                }
            }
        }
复制代码

 


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

 代码是AlexisEditor项目下的HhaForm.cs

 

 

 

posted @   Alexis  阅读(4336)  评论(26编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
点击右上角即可分享
微信分享提示