1. 程式人生 > >1、lib7z-Memory從記憶體或網路解壓資料(編譯原始碼、前期準備)

1、lib7z-Memory從記憶體或網路解壓資料(編譯原始碼、前期準備)

7z的壓縮率高,想用它從記憶體或網路請求到的資料中解壓資料到磁碟,這樣就不用再把資料生成.7z檔案在磁碟上,省去了耗時的IO操作,也節省了磁碟資源和時間。用這個技術去實現自己的安裝包也是可以的(把.7z檔案放進exe檔案中,再用這個方法把7z解壓到磁碟上)。想實現這個目的,首先需要編譯一下7z解壓的原始碼,然後把解壓7z的原始碼編譯成一個靜態的.lib檔案,把解壓功能做成一個函式供程式使用,比如這樣:
extern "C" BOOL Extra7zFromMemoryToPath(WCHAR* sTargetPath/**解壓目錄**/,
                                  char* pAllData/**全部資料**/,
                                  DWORD iLength/**全部資料的長度**/);


假如能實現這個函式,那麼我的目的也就實現了。經過研究lib7z在windows下的原始碼,終於實現了這個想法,在此把實現的過程和結果分享一下,也許對有些人有些幫助。
第一步:先編譯lib7z的原始碼,為後續工作做準備。
我先下載了7z的原始碼,工程有很多,都是VC6的c工程,找了半天才找到解壓7z的原始碼,是個控制檯工程,名字應該叫Dec7z,但時間長,也記不清了,我把它用我的VC6編譯,可以編譯通過,
但它是個控制檯程式,只能解壓已存在的.7z檔案。分析了其main函式,<pre name="code" class="cpp">int MY_CDECL main(int numargs, char *args[])
它在7zMain.c中。當然這個函式就是程式的啟動函式,它會分析你所輸入的引數,如果輸入'x'則解壓資料。
我用QtCreator新建了一個lib工程(個人喜歡這個,可以用多個版本的VC編譯器),然後把Dec7z的原始檔裝入。利用Vc6和Vc7編譯器順利構建成功(最後附工程原始碼)。
接下來就構建我自己的解壓函式:


實際上應該叫Extra7zFromMemoryToPath更合適些,但這是慢慢修改我之前的程式碼,所以也懶得改了,hwnd是要傳送訊息的窗體(我用這個做了自己的安裝包),置為NULL即可,
bUpdate則是安裝還是更新,我自己做的安裝檔案裡面用到的,無視即可。pAllData是記憶體或網路獲取到的資料,iLength是全部資料的長度,函式裡面的內容基本複製了之前
的main函式,在分析過程中我又加了不少註釋程式碼。

先說到這吧,最後修改過的lib工程和編譯結果下載,IDE我用的是QtCreator,編譯器用的VC6,用CodeBlocks或Vs把原始碼加進去生成相應的工程也一樣。

下載地址:http://download.csdn.net/detail/hats8888/9649147