使用NSIS打包超大型软件的几个注意事项
1,NSIS原版不支持超过2G的软件打包,因此需要用NSISBI。官网下载NSISBI,用里面的内容替代原始的NSIS软件目录。
2,原有NSIS目录中的插件不要忘记拷贝到新NSIS目录中;由于NSISBI的Plugins目录中根据平台分了多个子目录,需要拷贝到相应平台的子目录中。
3,NSISBI可以正常打包超过2G的安装包,但是如果原始软件文件大小超过4G多,在安装解压缩时显示的进度百分比会不正常。
这是因为进度条数值一般是利用NSIS的7z插件的"nsis7zU::ExtractWithCallback"方法来获取进度
1 2 | GetFunctionAddress $R9 ExtractCallback nsis7zU::ExtractWithCallback "$INSTDIR\${INSTALL_7Z_NAME}" $R9 |
"nsis7zU::ExtractWithCallback"方法会吐给Callback处理方法两个数值:当前解压缩字节数,最大字节数;通过这两个字节数的比值可以获得百分比。
问题在于这两个字节数貌似返回的是int32型,最大42亿。
如果打包的软件文件大小超过4个G多时,字节数就超过int32的最大值,导致溢出。
返回的最大字节数一开始就是溢出值,当前解压缩字节数逐步增大最后也会溢出,所以计算而得的百分比自然不正确了。
因为不知道nsis7z插件是否有新版提供int64返回值的支持,所以采用了一个对百分比取模的方法,一旦百分比超过100则舍去。
1 2 3 4 5 6 7 8 9 10 11 12 | Function ExtractCallback # $1为解压缩字节数,$2为字节总数。$0为取模后的百分比数值 Pop $1 Pop $2 System::Int64Op $2 / 100 Pop $3 System::Int64Op $1 / $3 Pop $4 System::Int64Op $4 % 100 Pop $0 ... |
这样UI上的显示就是:百分比滚动条到达百分百,然后归零,再次达到百分百,重复N次。
虽然看起来效果不佳,但至少能够持续看到安装进程的变化。
参考文档:
https://sourceforge.net/projects/nsisbi/
https://nsis.sourceforge.io/Nsis7z_plug-in
https://github.com/bajins/NSIS_SetupSkin
路漫漫其修远兮
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)