|
PECMD2012.1.73.1-130212.多窗口线程孵化版_win32.sfx.zip
test7zip.wcs(包内有):
//需要7_zip32.dll
// 导出7_zip32.dll的 3个函数
ENVI &&&Alias *opt SevenZipSetOwnerWindowEx=CALL $**ret:* 7_zip32.dll,SevenZipSetOwnerWindowEx,
ENVI &&&Alias *opt SevenZip=CALL $**ret:* 7_zip32.dll,SevenZip,
ENVI &&&Alias *opt SevenZipClearOwnerWindow=CALL $**ret:* 7_zip32.dll,SevenZipClearOwnerWindow,
ENVI &&&alias *opt MemoryCopy=CALL $**c **ret:* .,MemoryCopy,
CALL $? **ret:* .,WndProc1, &&WndProc1Addr //回调函数壳,反射回来调用 CALL OnWndProc1 参数
ENVI &&WM_PEBASE=0x5000 //PECMD 起始消息号
CALC #&&WM_7ZIP=%WM_PEBASE% + 0x101
WIN1
_SUB WIN1,W365H192,7Zip进度,TEAM ENVI &closeit=1|ENVI &doit=0
ITEM ITEM3,L50T21W60H30,解压, CALL OnJieYa,
EDIT &SRC,L120T23W190H25,test.7z,,0x100
LABE &LNAME,L37T71W288H18,,,
PBAR &PBAR1,L36T91W289H16,0
LABE -right &LSZIE,L223T116W102H20,,,
ITEM ,L52T115W60H30,终止, ENVI &doit=0,
ENVI @this.MSG=%&WM_7ZIP%::&&nState,&&lptag,CALL OnWM_7ZIP
ENVI &&ok=-1
ENVI &&closeit=0
ENVI &&doit=1 //0为取消
ENVI &&WID=%__WINID%
_END
_SUB OnJieYa
FIND $X=X%&SRC%, EXIT
ENVI &&WID=%__WINID%
IFEX %&SRC%,! TEAM MESS+icon0 %&SRC% 不存在| EXIT
ENVI &&wcmd=x %&SRC% -y -hide
ENVI-tom &&acmd=&wcmd // ANSI 编码的命令
ENVI-addr &&acmdadr=&acmd
ENVI#% &&buf=*32768
ENVI-addr &&bufadr=&buf
ENVI &closeit=0 //
ENVI &ok=-1
ENVI &doit=1 //
ENVI &&&WndProc1 // WndProc1 绑定到当前 PE执行栈,以寻找 OnWndProc1 函数
SevenZipSetOwnerWindowEx &&ret,#%__WINID% ,#%&WndProc1Addr% //绑定到父窗口和回调函数
SevenZip &&ret,#%__WINID%,#%&acmdadr%,#%&bufadr%,#32768 //开动7ZIP
SevenZipClearOwnerWindow &&ret //父窗口和回调函数 解绑
ENVI &&&WndProc1=0 // WndProc1 解绑
IFEX $1=%&closeit%, EXIT
IFEX $-1=%&ok%, MESS+icon6 解压失败@7ZIP解压演示 #OK
IFEX $1=%&ok%, MESS+icon2 解压完成@7ZIP解压演示 #OK
IFEX $0=%&ok%, MESS+icon0 解压取消@7ZIP解压演示 #OK
_END
_SUB OnWM_7ZIP
IFEX $%lptag%>0, //结构地址非0
{
ENVI-make &&tag=%lptag%;8
GETF -bin &&tag,0#8,&&tagHex
MSTR &&FSZ1,&&FSZ2,&&FSZ3,&&FSZ4,&&WSZ1,&&WSZ2,&&WSZ3,&&WSZ4=<1*>%&tagHex%
CALC #&&FS=%&FSZ1% + %&FSZ2% * 0x100 + %&FSZ3% * 0x10000 + %&FSZ4% * 0x100000 //总长度
CALC #&&WS=%&WSZ1% + %&WSZ2% * 0x100 + %&WSZ3% * 0x10000 + %&WSZ4% * 0x100000 //已写长度
CALC #&&percent=(100* %&WS% ) / %&FS%
// 524 + 513
CALC #&&dstfnadr=%lptag% + 524
ENVI#$ &&dst=*513 0 //
ENVI-addr &&dstadr=&dst
MemoryCopy ,#%&&dstadr%,#%&dstfnadr%,#513
ENVI-tow &&wdst=&dst
ENVI @&PBAR1=%&percent%
ENVI @&LSZIE=%&WS%/%&FS%
ENVI @&LNAME=%&wdst%
}
IFEX $2=%&nState%, TEAM ENVI &ok=%&doit% // MESS 完成
_END
// WndProc1 调用用户脚本函数 OnWndProc1
//OnWndProc1 hWnd nMsg nState lptagEXTRACTINGINFOEX
_SUB OnWndProc1
ENVI @@SENDMSG=%&WID%;%&WM_7ZIP%;%3;%4
exit= %&doit% //返回1=继续 0=终止
_END
压缩命令:
ENVI &&wcmd=a 7ZIP文件名 源文件... -y -hide //7zip压缩命令
后面还可以解其他选项
-p密码
-mx压缩级别 //0~9
-sfx //自解压
-v%Volume% //分卷
-w工作目录
上面解压命令:
-o"解压到的目录"
回调信息结构 tagEXTRACTINGINFOEX
struct tagEXTRACTINGINFOEX
{
long dwFileSize; //总长度 4Byte
long dwWriteSize; //已写长度 4Byte
char szSourceFileName[513];
char dummy1[3];
char szDestFileName[513];
char dummy[3];
long dwCompressedSize;
long dwCRC;
long uOSType;
long wRatio;
long wDate;
long wTime;
char szAttribute[8];
char szMode[8];
};
[ 本帖最后由 mdyblog 于 2013-2-14 14:43 编辑 ] |
|