nsis 7z 解压获取进度
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 | 几乎所有玩过nsis的人在制作安装进度页面时都会遇到一个比较棘手的问题,画出进度条容易,但准确掌握文件释放进度,同时再去配合进度条的进度在nsis看来几乎是个无法逾越的障碍,因为迄今为止NSIS尚无可直接使用的指令或者函数来获取相关数据。网络上解决这个问题大部分做法都是大约分为若干段,20%...40%...80%...100%这样大概做个进度的样子,其实与释放的文件几乎没什么联系,并且误差非常大,我这个办法可以尽最大可能的让进度条进度与文件释放进度相匹配,脚本里面使用到两个nsis插件: 官方下载: NSIS7Z plug- in http: //nsis .sourceforge.net /Nsis7z_plug-in BgWorker plug- in http: //nsis .sourceforge.net /BgWorker_plug-in 将你要封装的文件按照部署的结构用7zip压缩备用 原理:自定义界面设置计数器启动后台线程,然后获取7z插件的回调函数数据。 封装脚本: Outfile "customProgressBar.exe" !include nsDialogs.nsh !define /math PBM_SETRANGE32 ${WM_USER} + 6 #定义nsis未包含的进度条相关常量 InstallDir "C:\test" page custom custompage Function custompage nsDialogs::Create 1018 Pop $0 ${NSD_CreateLabel} 100 100 100% 30u "开始安装..." Pop $9 SetCtlColors $9 0x000000 0xECE9D8 ${NSD_CreateProgressBar} 0 50 100% 20 "" Pop $8 ${NSD_CreateTimer} OnDialogTimer 50 nsDialogs::Show FunctionEnd Function OnDialogTimer ${NSD_KillTimer} OnDialogTimer SendMessage $8 ${PBM_SETRANGE32} 1 100 GetFunctionAddress $0 Extractfunc BgWorker::CallAndWait #启动一个低优先级的后台线程 FunctionEnd Function Extractfunc SetOutPath $INSTDIR File "test.7z" GetFunctionAddress $R9 Callback Nsis7z::ExtractWithCallback "test.7z" $R9 Delete "$OUTDIR\test.7z" FunctionEnd Function Callback Pop $R8 Pop $R9 System::Int64Op $R8 * 100 Pop $R0 System::Int64Op $R0 / $R9 Pop $R3 SendMessage $8 ${PBM_SETPOS} $R3 0 ${NSD_SetText} $9 "已经安装$R3%" ${ if } $R8 = $R9 ${NSD_SetText} $9 "安装完成" #由于计算方式的四舍五入特性,进度条到安装完成时会有字节级别的误差,此处消除。 SendMessage $8 ${PBM_SETPOS} 100 0 System::Call "user32::InvalidateRect(i$hwndparent,i0,i 1)" ${endif} FunctionEnd Section DetailPrint "..." SectionEnd |
文章迁移,转载地址,已不确定