天天看點

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;  

        [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 

<a href="http://down.51cto.com/data/2358218" target="_blank">附件:http://down.51cto.com/data/2358218</a>

    本文轉自xshf12345 51CTO部落格,原文連結:http://blog.51cto.com/alexis/574539,如需轉載請自行聯系原作者

繼續閱讀