介紹
很早以前我就想過將一些常用的HTML Help幫助信息(也就是CHM文件)集成到MSDN庫中,但一直都沒有找到好的辦法。有一天我偶然上了codejoke的網站,發現了它:MSDN Integration,這不就是我夢寐以求的嗎?真是夢裡尋她千百度,蓦然回首她就在網絡某一處 ......而且,更令人喜出往外的是這個實用程序還提供全部的源代碼。我下載下來狂研究了一番後,發現它真是個不錯的東東。遂將它整理出來以飨那些有同樣需求的弟兄。
起步篇
大家知道,MSDN庫中的信息都是用HTML Help文件以“集合(collection)”的形式組織起來的。一個集合便是一個XML格式化文件,它包含MSDN使用的幫助文件信息。集合使用的文件有兩個,一個是msdnxxx.col,另一個是hhcolreg.dat。前者為實際的集合,包含集合使用的全部html文件清單。這個文件的名字一般都以“msdn”開始,後綴為“.col”。如2000年6月的信息集合文件名為msdn020.col。hhcolreg.dat文件是集合的注冊文件。它存儲有關每個集合的細節信息,如HTML Help文件的位置以及索引文件和版本號標題。因此我們首先要找到這兩個文件。
查找 msdnxxx.col 文件
如果你安裝了MSDN庫的話,用 regedit 實用程序就可以在系統注冊表中查找到 msdnxxx.col 文件的位置,其注冊表鍵值是:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\HTML Help Collections\Developer Collections
這裡是微軟存儲HTML Help幫助文件集合的位置。這個鍵值下會列出語言入口,它說明信息集合使用的是哪種語言。典型的值如0x0409表示英語,每種語言都用不同的值表示。下一個鍵值是你最想要的:即當前MSDN首選的集合是哪個。典型的值如:0x0393a0c80,這個值根據擬所安裝的MSDN不同而不同。它下面有一項是Filename,它指定了msdnxxx.col文件在硬盤上的物理存放位置。
查找 hhcolreg.dat 文件
hhcolreg.dat文件與msdnxxx.col一樣也是一個XML格式的文件,它包含集成幫助文件的特定信息。在老版本的MSDN庫中,這個文件被放在 “Windows\Help”目錄中。後來的版本把這個文件的存放位置移到了“\Documents and Settings\All Users\Application Data\Microsoft\HTML Help\”目錄。從5.0版本的shell32.dll開始,我們可以用CSIDL_COMMON_APPDATA標志調用GetSpecialFolderPath(...)API函數來獲取這個文件的存放路徑。但是IE後來的版本把這個函數移到了ShFolder.dll中。因此,我們創建了一個自己的版本來獲取這個文件的存放路徑,它就叫xtAfxGetSpecialFolderPath(...)。我們還能通過msdnxxx.col文件中的collectionnum標簽來確定hhcolreg.dat文件的存放目錄。典型地,如果這個值小於10000,則這個文件存放在“Windows/Help”目錄。
編輯集合文件
現在,我們找到了hhcolreg.dat和msdnxxx.col兩個文件,為了正確集成數據信息,接下來我們要編輯這兩個文件。首先來看看msdnxxx.col,用文本編輯器打開這個文件。在前面的幾行裡你會發現有兩個標簽:masterlangid 和 collectionnum。這兩個標簽對我們要做的事情來說非常重要。masterlangid 告訴我們集合使用的是哪種語言,collectionnum 表示目前處理的是哪個集合。這兩個標簽典型的值為:
<masterlangid value=1033/>
<collectionnum value=10002/>
集合中的每一個入口都以<Folder>開始,以</Folder>結束。你要關心的值有三個。兩個TitleString標簽和一個LangId標簽。第一個TitleString標簽的值是啟動MSDN庫後,選中“目錄”顯示的內容。第二個TitleString的值是集合的標示符,這個值在集合中必須是唯一的,hhcolreg.dat文件中也要用到它。標簽LangId的值就是masterlangid的值。
下面是典型的集合文件內容前幾行例子:
<Folder>
<TitleString value="VC知識庫"/>
<FolderOrder value=2/>
<Folder>
<TitleString value="=在線雜志"/>
<FolderOrder value=1/>
<LangId value=1033/>
</Folder>
</Folder>
編輯集合注冊入口表文件
接下來我們要更新hhcolreg.dat文件。用文本編輯器打開這個文件。你會注意到每個入口都以<DocCompilation> 標簽開始,以</DocCompilation>結束。這裡有六個標簽是我們要關心的:
DocCompId標簽的值與msdnxxx.col文件中第二個TitleString標簽的值相同。這個值在集合中必須唯一且必須完全匹配!
DocCompLanguage標簽的值與msdnxxx.col文件中LangId標簽的值相同,它必須與masterlangid的值匹配。
ColNum標簽是集合編號,它必須與msdnxxx.col文件中collectionnum 的值匹配。
TitleLocation 標簽是*.chm 文件存放的全路經名。
IndexLocation 標簽為*.chi 文件存放的全路經名。
最後一個是Version標簽,用它指定集合信息的版本。
下面是一個典型的集合注冊入口表:
<DocCompilation>
<DocCompId value="xtreme_toolkit"/>
<DocCompLanguage value=1033/>
<LocationHistory>
<ColNum value=10001/>
<TitleLocation value="[full path]Xtreme.chm"/>
<IndexLocation value="[full path]Xtreme.chi"/>
<LocationRef value=""/>
<Version value=2/>
</LocationHistory>
</DocCompilation>
大功告成
編譯HTML Help文件時,你必須讓編譯器產生.chi索引和二進制的目錄表,也就是toc.hhc文件。MSDN庫需要用到這兩個文件。為此,在.hhp工程文件的[OPTIONS]段裡要加上“Create CHI file=Yes”,“Binary TOC=Yes”選項。建議你將.chm文件和.chi文件放在MSDN庫的集合目錄中,但不一定非要這樣做,放在其它地方,只要指定正確的路徑也可以。編輯完集合文件之後,啟動MSDN庫,選中索引簽產生幫助索引。此時會彈出一個對話框告訴你正在產生索引。
創建HTML Help的工具
在集成MSDN之前,你必須創建好CHM文件。使用微軟提供的免費工具HTML Help Workshop可以很方便的產生HTML Help文件。此外網上還有很多第三方開發的工具,不過都是要你掏銀子購買的。
MSDN 幫助信息集成實用工具
如果你覺得自己是個懶人,本文將給你提供一個方便的實用工具,用它就可以輕松將你的HTML Help文件集成到MSDN中。如圖一所示。
圖一 MSDN 幫助信息集成實用工具
你只要輸入.chm和.chi文件的路徑,提供一個集合信息標題串,定義一個幫助文件的唯一標示符。這個唯一標示符你可以自己取名定義,但最保險的方式是用GUID來保證它的唯一性,工具程序為你提供了一個按鈕“Gen.GUID”來自動產生這個唯一標示。你還可以指定幫助文件的版本號,但此項不是必輸項。最後按“集成到MSDN庫”按鈕。 實用工具的源代碼可以從本文的開始處的鏈接下載,與集成有關的所有代碼都封裝在了CMSDNIntegration 類中,根據codejoke的許可協議,CMSDNIntegration類的源代碼是免費使用的,因此你可以在自己的MFC程序中無限制地使用這個類來定制集成工具。在CMSDNIntegration的定義文件中還有一個代碼中用到的輔助類CLoadLibrary,它實現了加載某個dll並獲取版本號。詳細的使用說明請參考完整的幫助文件。下圖是我將《VC知識庫在線雜志》第八期和第九期集成到MSDN庫的情形。
圖二 將《VC知識庫在線雜志》集成到MSDN
本文配套源碼