編譯chm工程(.hhp)有兩種方法:
調用hhc.exe
調用HHA_CompileHHP
調用hhc.exe編譯,代碼如下:
// strChmFileName為你的hhp文件的長文件名
CString strCmdLine;
strCmdLine = "hhc.exe ";
strCmdLine += strChmFileName;
WinExec(strCmdLine, SW_SHOWNORMAL);
用這種方法調用有很多缺點,首先,沒有編譯進度,沒有任何提示,根據我的測試,還不支持有空格的文件名。一般專業的chm制作軟件都是調用的hha.dll中的HHA_CompileHHP函數進行編譯。我們這裡不討論如何生成chm的工程文件,這個可以參考Html Help WorkShop生成的文件。調用HHA_CompileHHP,微軟沒有提供函數聲明,也沒有提供幫助信息。(據說要和微軟簽訂協議,才可以拿到函數聲明及相關的頭文件)參考了網上一篇介紹用delphi實現函數調用的文章,加上我的一點試驗,終於我VC實現了。ok,看看我是怎麼實現的。
先說下HHA_CompileHHP的參數:
(const char*, LPVOID, LPVOID, int)
第一個參數為你要編譯的hhp文件名
第二個參數是編譯日志回調函數
第三個參數是編譯進度回調函數
第四個參數不知道什麼用,我把他置為0
開始寫代碼了
///////////////////////////////////
// 下面是兩個回調函數的聲明
BOOL CALLBACK FunLog(char* pstr);
BOOL CALLBACK FunProc(char* pstr);
//
// CompileHHP
// 調用HHA_CompileHHP編譯chm工程
// 參數:pzFileName為待編譯hhp文件名
// 作者:吳會然([email protected])
// blog: http://blog.sina.com.cn/u/1272907062
////////////////////////////////////////////////////////////////////////////////////
void CCompileCHMDemoDlg::BuildChmFile(CString strHHPFile)
{
HINSTANCE hinstLib;
typedef BOOL (WINAPI *MYFUNC)(const char*, LPVOID, LPVOID, int);
BOOL fFreeResult, fRunTimeLinkSuccess = FALSE;
MYFUNC ProcAdd = NULL;
// Get a handle to the DLL module.
hinstLib = LoadLibrary("hha.dll");
// If the handle is valid, try to get the function address.
if (hinstLib != NULL)
{
ProcAdd = (MYFUNC) GetProcAddress(hinstLib, "HHA_CompileHHP");
// If the function address is valid, call the function.
LPCSTR pzFileNmae = strHHPFile.GetBuffer(strHHPFile.GetLength());
if (fRunTimeLinkSuccess = (ProcAdd != NULL))
{
if(ProcAdd(pzFileNmae, FunLog, FunProc, 0))
{
}
}
// Free the DLL module.
fFreeResult = FreeLibrary(hinstLib);
}
if(m_pStatusBar)
m_pStatusBar->SetPaneText(0, "編譯完成!");
// If unable to call the DLL function, use an alternative.
if (! fRunTimeLinkSuccess)
printf("message via alternative method\n");
}
//////////////////////////////////////////////////////////////////////////////////////
// FunLog()
// 編譯日志回調函數
// 參數:日志字符串
// 作者:吳會然([email protected])
// blog: http://blog.sina.com.cn/u/1272907062
////////////////////////////////////////////////////////////////
BOOL FunLog(char* pstr)
{
ASSERT(pstr);
CString strMsg;
strMsg.Format("%s", pstr);
// AfxMessageBox(strMsg);
return true;
}
//////////////////////////////////////////////////////////////
//
// FunProc()
// 編譯進度回調函數
// 參數:進度字符串
// 作者:吳會然([email protected])
// blog: http://blog.sina.com.cn/u/1272907062
//////////////////////////////////////////////////////////////
BOOL FunProc(char* pstr)
{
ASSERT(pstr);
CString strMsg;
strMsg.Format("%s", pstr);
// AfxMessageBox(strMsg);
return true;
}
聯系方式:
http://blog.sina.com.cn/u/1272907062
上面的測試代碼在VC6.0+WIN2003下編譯通過,請確保你的系統目錄或程序當前目錄下存在hha.dll文件。
歡迎大家交流指正……
本文配套源碼