程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C#生成CHM文件(外篇使用hha.dll),

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

編輯:C#入門知識

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的設置選項,去掉“刪除臨時文件”來獲得),有興趣的朋友可以更加深入,比如獲得編譯進度信息,顯示編譯進度等等。。。。


C語言中 ^怎使用

a1 = 0x01; //0000 0001
a2 = 0x00; //0000 0000
a3 = 0x03; //0000 0011
a4 = 0x02; //0000 0010

b1 = a1 ^ a2; //0000 0001
b2 = a1 ^ a3; //0000 0010
b3 = a1 ^ a4; //0000 0011

^異或運算符,位值相同為0,不同為1,見上示例.

//
簡單實際問題舉例:
======\=======\=======
======a=======b=======
上面是2條電路,2個開關分別為a和b,打開狀態:\[1],關閉狀態:/[0].
若同時打開或者關閉,兩條電路均不通.
若a打開[1],b關閉[0],電路1通電
======\=======/=======
若a關閉[0],b打開[1],電路2通電
======/=======\=======
綜上,電路在a,b狀態相同時不通[0],在a,b不同時通電[1].
 

C語言中 ^怎使用

a1 = 0x01; //0000 0001
a2 = 0x00; //0000 0000
a3 = 0x03; //0000 0011
a4 = 0x02; //0000 0010

b1 = a1 ^ a2; //0000 0001
b2 = a1 ^ a3; //0000 0010
b3 = a1 ^ a4; //0000 0011

^異或運算符,位值相同為0,不同為1,見上示例.

//
簡單實際問題舉例:
======\=======\=======
======a=======b=======
上面是2條電路,2個開關分別為a和b,打開狀態:\[1],關閉狀態:/[0].
若同時打開或者關閉,兩條電路均不通.
若a打開[1],b關閉[0],電路1通電
======\=======/=======
若a關閉[0],b打開[1],電路2通電
======/=======\=======
綜上,電路在a,b狀態相同時不通[0],在a,b不同時通電[1].
 

  1. 上一頁:
  2. 下一頁: