7-Zip 压缩与解压库-调用范例

Welcome to the 7-Zip Home!开源站:http://www.7-zip.org/ 感谢Igor Pavlov的开源精神......
LZMA,(Lempel-Ziv-Markov chain-Algorithm的缩写),是一个Deflate和LZ77算法改良和优化后的压缩算法,开发者是Igor Pavlov,2001年被首次应用于7-Zip压缩工具中,是 2001年以来得到发展的一个数据压缩算法。它使用类似于 LZ77 的字典编码机制,在一般的情况下压缩率比 bzip2 为高,用于压缩的可变字典最大小可达4GB。
LZMA 是 7-Zip 程序中7z 格式的默认压缩算法。LZMA 能提供给用户极高的压缩比及较快的压缩速度,它非常适合与应用程序集成
正是出于这点,今天才研究了一下,我想,对我现在的情形,重构它可能性几乎为0。主要是没有这个时间和精力,不过生成目标文件与自己的程序集成是可行的(刚才经过优化生成了个10KB的obj文件),对我们而言,解压这种格式是最必要的,首先我们压缩之后,在我们的程序中只要集成解压程序是不错的,像千千静听的皮肤资源就是以这种方式,当然它用的是zip格式,考虑到7z的优越性能,所以对其如何调用,有必要研究一下。
不说废话了...............对了,还提醒一下,要下载LZMA SDK的同样在上面的网站上找,只是目前对其公开的内嵌式应用很少获得技术细节,所以...................

 

 

;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ;*--==--* Call LZMA.Dll example (Lempel-Ziv-Markov chain-Algorithm) ;*--==--* By G-Spider 2010.10.18 ;*--==--* Web:http://blog.csdn.net/G_Spider ;*--==--* ------------------------------------------------------------------- ;*--==--* ml /c /coff TestLzmaDll.asm ;*--==--* link /subsystem:console TestLzmaDll.obj ;*--==--* 请保持以上完整性!! ;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ .586 .model flat,stdcall option casemap:none include windows.inc include kernel32.inc include user32.inc include msvcrt.inc includelib kernel32.lib includelib user32.lib includelib msvcrt.lib pcomethod6 TYPEDEF PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD comethod6 TYPEDEF PTR pcomethod6 pcomethod13 TYPEDEF PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD,/ :DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD comethod13 TYPEDEF PTR pcomethod13 ;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ .data szLzmaDLL db 'Lzma.dll',0 szLzmaCompress db 'LzmaCompress',0 szLzmaUncompress db 'LzmaUncompress',0 szFileName db 'Test.bmp',0 ;待压缩文件,可为全路径等,下同 szCompressName db 'tst.lzma',0 ;压缩后的文件名 szUncompressName db 'mytst.bmp',0 ;解压后的文件名 szInform1 db 'LzmaCompressing ....',0dh,0ah,0 szInform2 db 'LzmaUnCompressing ....',0dh,0ah,0 szInform3 db 'All Success ....',0dh,0ah,0 OutProps db 0,0,0,0,0 OutPropsSize dd 5 ;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ .data? LzmaCompress comethod13 ? LzmaUncompress comethod6 ? hLzmaDLL dd ? hHandle dd ? hHandle1 dd ? hHandle2 dd ? lpInputBuf dd ? lpOutputBuf dd ? dwInputSize dd ? dwOutputLen dd ? lpNumberOfBytes dd ? lpNumberOfBytes1 dd ? .code ;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ start: ;------------------------------------------------------------------------ invoke LoadLibrary,offset szLzmaDLL mov hLzmaDLL,eax push eax invoke GetProcAddress,eax,offset szLzmaCompress mov LzmaCompress,eax pop eax invoke GetProcAddress,eax,offset szLzmaUncompress mov LzmaUncompress,eax ;------------------------------------------------------------------------ ;预处理 invoke CreateFile,offset szFileName,GENERIC_READ,FILE_SHARE_READ,/ NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL MOV hHandle,eax invoke GetFileSize,eax,NULL mov dwInputSize,eax mov dwOutputLen,eax invoke crt_malloc,dwInputSize mov lpInputBuf,eax invoke RtlZeroMemory,lpInputBuf,dwInputSize invoke ReadFile,hHandle,lpInputBuf,dwInputSize,offset lpNumberOfBytes1,NULL invoke crt_malloc,dwOutputLen mov lpOutputBuf,eax invoke RtlZeroMemory,lpOutputBuf,dwOutputLen invoke crt_printf,offset szInform1 ;------------------------------------------------------------------------ ;文件压缩,成功则返回0 invoke LzmaCompress,lpOutputBuf,offset dwOutputLen,lpInputBuf, dwInputSize,/ offset OutProps,offset OutPropsSize,5, 10000h, 3, 0, 2, 32,2 .if eax==0 invoke crt_printf,offset szInform2 .endif invoke RtlZeroMemory,lpInputBuf,dwInputSize ;------------------------------------------------------------------------ ;文件解压,成功则返回0 invoke LzmaUncompress,lpInputBuf,offset dwInputSize,lpOutputBuf,/ offset dwOutputLen,offset OutProps,OutPropsSize .if eax == 0 invoke crt_printf,offset szInform3 .endif ;------------------------------------------------------------------------ ;输出压缩文件 invoke CreateFile,offset szCompressName,GENERIC_WRITE,FILE_SHARE_READ,/ NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL .if eax == INVALID_HANDLE_VALUE invoke MessageBox,NULL,0,0,0 .endif mov hHandle1,eax invoke WriteFile,eax,lpOutputBuf,dwOutputLen,offset lpNumberOfBytes,NULL ;输出解压文件 invoke CreateFile,offset szUncompressName,GENERIC_WRITE,FILE_SHARE_READ,/ NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL mov hHandle2,eax invoke WriteFile,eax,lpInputBuf,dwInputSize,offset lpNumberOfBytes,NULL invoke CloseHandle,hHandle invoke CloseHandle,hHandle1 invoke CloseHandle,hHandle2 invoke FreeLibrary,hLzmaDLL invoke ExitProcess,0 end start ;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$

 

 

7-Zip 压缩与解压库-调用范例_第1张图片

 

还有,有了上面的了解,对于集成到你的应用程序中应该问题不大了,呵呵,这个是我集成的版本(不包含压缩过程,只含解压)

 

以上文件下载:

lzma 7z 压缩解压调用源码

你可能感兴趣的:(Win32/64汇编)