在线CHM阅读器(1)——CHM文件格式概述
之前開源的WEBOS中有一個在線CHM閱讀器,本文將介紹如何開發一個功能類似的在線CHM閱讀器。
效果圖
相關技術
1.Structured Storage
Structured Storage provides file and data persistence in COM by handling a single file as a structured collection of objects known as storages and streams.
The purpose of Structured Storage is to reduce the performance penalties and overhead associated with storing separate objects in a single file. Structured Storage provides a solution by defining how to handle a single file entity as a structured collection of two types of objects—storages and streams—through a standard implementation called Compound Files. This enables the user to interact with, and manage, a compound file as if it were a single file rather than a nested hierarchy of separate objects.
關于Structured Storage請查閱MSDN,CHM文件本質上就是一個結構化存儲格式的文件,因此,如果要讀取CHM中的文件,需要知道Structured Storage的相關API。
2.ISAPI篩選器
ISAPI(Internet Server Application Programming Interface)作為一種可用來替代CGI的方法,是由微軟和Process軟件公司聯合提出的Web服務器上的API標準。ISAPI與Web服務器結合緊密,功能強大,能夠獲得大量的信息,因此利用ISAPI可以開發出靈活高效的Web服務器增強程序。實現CHM在線閱讀器(在不反編譯的情況下)需要使用ISAPI篩選器來實現URL重定向。
3.Lesktop
Lesktop是一款用于開發RIA網站的開源JS界面庫,Lesktop提供了一個功能強大的可視化開發工具幫助您快速的開發RIA網站。本文介紹的CHM在線閱讀器將使用Lesktop來開發前臺界面。
CHM文件格式
1.反編譯CHM文件
要閱讀CHM文件,首先就必須反編譯CHM文件,提取出其中的文件(網頁,圖片等),反編譯CHM文件需要用到WIN32 API的StgOpenStorage函數,.NET反編譯CHM文件的方法可閱讀這篇文章:
CHM Help File Extractor
2.#SYSTEM文件
反編譯CHM文件后,您可以在解壓出來的文件中看到這個名稱為#SYSTEM的文件,這個文件保存了一些關于CHM文件的信息,例如起始頁,標題等等。#SYSTEM是一個二進制文件,其格式也并不復雜,格式如下所示:
ID(2字節)+數據長度(2字節)+數據(字節數由數據長度決定)
#SYSTEM文件就是有多個以上這種數據構成,根據這個規律,可以讀取出所有ID對應的數據,并保存到一個Hashtable中,代碼如下:
private bool ReadSession(BinaryReader reader)
{
if (reader.BaseStream.Position >= reader.BaseStream.Length) return false;
UInt16 id = reader.ReadUInt16();
UInt16 count = reader.ReadUInt16();
if (count + reader.BaseStream.Position <= reader.BaseStream.Length)
{
if (count > 0)
{
_session[id] = reader.ReadBytes(count);
}
return true;
}
else
{
return false;
}
}
public ChmInfo(Stream stream)
{
BinaryReader reader = new BinaryReader(stream);
while (ReadSession(reader)) ;
}
目前可以確定的ID和數據對應關系如下:
0x0002 - 起始頁的路徑
0x0003 - 標題
0x0004 - 語言
根據這個對應關系,就可以讀取出CHM文件的標題,起始頁等。
3.目錄文件(*.hhc)
如果CHM帶有目錄的話,反編譯CHM文件后,您可以在解壓出來的文件中看到一個擴展名為HHC的文件,這個文件保存了CHM的目錄結構。
上圖是一個HHC文件的內容,大概的規律是,每一個<LI><OBJECT>…<OBJECT>對應著目錄樹中的一個節點,<OBJECT>…<OBJECT>中的參數記錄著該節點的屬性(對應的頁面,名稱等)。如果這個節點有子節點的話,那么<LI>后面會緊跟著一個<UL></UL>,<UL>里面所有的節點都是其子節點。
上文已簡單的介紹了如何反編譯CHM的文件格式以及關鍵文件的格式,在下一篇文章中,將介紹如何處理目錄文件(*.hhc文件)以及如何利用ISAPI篩選器在沒有反編譯出CHM內部文件的情況下實現一個在線CHM閱讀器。
盡管目前這個系列還沒有完成,但是您可以先下載源代碼預覽一下這個在線CHM閱讀器:
在線CHM閱讀器源代碼(注意:該CHM閱讀器需要用到ISAPI篩選器,請仔細閱讀部署須知)
如果您有任何問題,可以通過WebIM與我聯系。
總結
以上是生活随笔為你收集整理的在线CHM阅读器(1)——CHM文件格式概述的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 腾讯市值多少 腾讯的市值有多少
- 下一篇: 基金公司排行榜 基金公司排名