杉宫竹苑工作室

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 2401|回复: 0

NSIS 自定义安装界面准确获取安装进度完美解决方案

[复制链接]
发表于 2017-4-28 16:57:54 | 显示全部楼层 |阅读模式

正式会员享受无限制浏览网站功能和高速网盘下载,赶快加入本站吧!

您需要 登录 才可以下载或查看,没有账号?立即注册

x
友情提醒:随着7zip版本快速更新,nsis7z插件已经不能全面兼容新版,使用本例子请将7zip版本降至9.2x以下并下载最新版nsis7z.dll!
----------------------------------------------------------------------------------------------------------------
几乎所有玩过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插件的回调函数数据。
封装脚本:

  1. Outfile "customProgressBar.exe"

  2. !include nsDialogs.nsh
  3. !define /math PBM_SETRANGE32 ${WM_USER} + 6 #定义nsis未包含的进度条相关常量
  4. #编写:水晶石
  5. InstallDir "C:\test"
  6. page custom custompage

  7. Function custompage
  8. nsDialogs::Create 1018
  9.   Pop $0
  10.   ${NSD_CreateLabel} 100 100 100% 30u "开始安装..."
  11.   Pop $9
  12.   SetCtlColors $9  0x000000 0xECE9D8
  13.   ${NSD_CreateProgressBar} 0 50 100% 20 ""
  14.   Pop $8
  15.   ${NSD_CreateTimer} OnDialogTimer 50
  16. nsDialogs::Show
  17. FunctionEnd

  18. Function OnDialogTimer
  19.   ${NSD_KillTimer} OnDialogTimer
  20.   SendMessage $8 ${PBM_SETRANGE32} 1 100
  21.   GetFunctionAddress $0 Extractfunc
  22.   BgWorker::CallAndWait #启动一个低优先级的后台线程
  23. FunctionEnd

  24. Function Extractfunc
  25.   SetOutPath $INSTDIR
  26.   File "test.7z"
  27.   GetFunctionAddress $R9 Callback
  28.   Nsis7z::ExtractWithCallback "test.7z" $R9
  29.   Delete "$OUTDIR\test.7z"
  30. FunctionEnd

  31. Function Callback
  32.   Pop $R8
  33.   Pop $R9
  34.   System::Int64Op $R8 * 100
  35.   Pop $R0
  36.   System::Int64Op $R0 / $R9
  37.   Pop $R3
  38.   SendMessage $8 ${PBM_SETPOS} $R3 0
  39.   ${NSD_SetText} $9 "已经安装$R3%"
  40.   ${if} $R8 = $R9
  41.   ${NSD_SetText} $9 "安装完成"
  42.   #由于计算方式的四舍五入特性,进度条到安装完成时会有字节级别的误差,此处消除。
  43.   SendMessage $8 ${PBM_SETPOS} 100 0
  44.   System::Call "user32::InvalidateRect(i$hwndparent,i0,i 1)"
  45.   ${endif}
  46. FunctionEnd

  47. Section
  48. DetailPrint "..."
  49. SectionEnd
复制代码

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|手机版|Archiver|SgzyStudio

GMT+8, 2024-5-11 17:51 , Processed in 0.108188 second(s), 22 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表