7z的压缩率高,想用它从内存或网络请求到的数据中解压数据到磁盘,这样就不用再把数据生成.7z文件在磁盘上,省去了耗时的IO操作,也节省了磁盘资源和时间。用这个技术去实现自己的安装包也是可以的(把.7z文件放进exe文件中,再用这个方法把7z解压到磁盘上)。想实现这个目的,首先需要编译一下7z解压的源码,然后把解压7z的源码编译成一个静态的.lib文件,把解压功能做成一个函数供程序使用,比如这样:
假如能实现这个函数,那么我的目的也就实现了。经过研究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函数,在分析过程中我又加了不少注释代码。
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