NSIS 自定义安装界面准确获取安装进度完美解决方案
来源:互联网 发布:微信交友源码 编辑:程序博客网 时间:2024/05/18 23:13
友情提醒:随着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插件的回调函数数据。
封装脚本:
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
转载网址:http://blog.csdn.net/shuijing_0/article/details/8291299
- NSIS 自定义安装界面准确获取安装进度完美解决方案
- NSIS 自定义安装界面准确获取安装进度完美解决方案
- NSIS 自定义安装界面准确获取安装进度完美解决方案
- 通过nsis和duilib实现自定义安装界面
- NSIS 自定义安装部署实例
- 提供修复界面的NSIS安装包
- nsis制作新版迅雷安装界面
- NSIS安装界面无虚线框移动
- NSIS自定义界面修改
- NSIS获取安装包的名称
- NSIS 安装界面前端显示(设置TOPMOST属性)
- InstallShield 自定义安装界面
- InstallShield自定义安装界面
- InstallShield自定义安装界面
- InstallShield自定义安装界面
- InstallShield自定义安装界面
- NSIS 自定义页面结合组件选择安装(二)
- NSIS自定义目录选择页面制作之安装…
- C# 微信接口之推送模版消息
- hdu5373 The shortest problem(迭代模拟+同余定理)
- Poj 1789 Truck History【最小生成树】
- centos配置nfs服务详细步骤(centos开启nfs服务)
- 合成复用原则
- NSIS 自定义安装界面准确获取安装进度完美解决方案
- Java ClassLoader基础及加载不同依赖 Jar 中的公共类
- html5 表单
- 黑马程序员----------------java基础-----------------Map集合
- 多校第七场 1011 hdu 5379 Mahjong tree(树形dp)
- hdu1075(trie树)
- 通用权限拦
- 六大原则
- poj 1080 LCS 应用