程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> 關於VC++ >> 調用HHA_CompileHHP編譯chm工程

調用HHA_CompileHHP編譯chm工程

編輯:關於VC++

編譯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;
}

聯系方式:

[email protected]

http://blog.sina.com.cn/u/1272907062

上面的測試代碼在VC6.0+WIN2003下編譯通過,請確保你的系統目錄或程序當前目錄下存在hha.dll文件。

歡迎大家交流指正……

本文配套源碼

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved