写点什么

使用 NSIS 打包超大型软件的几个注意事项

作者:大伟
  • 2023-04-04
    北京
  • 本文字数:781 字

    阅读完需:约 3 分钟

1,NSIS 原版不支持超过 2G 的软件打包,因此需要用 NSISBI。官网下载 NSISBI,用里面的内容替代原始的 NSIS 软件目录。


2,原有 NSIS 目录中的插件不要忘记拷贝到新 NSIS 目录中;由于 NSISBI 的 Plugins 目录中根据平台分了多个子目录,需要拷贝到相应平台的子目录中。


3,NSISBI 可以正常打包超过 2G 的安装包,但是如果原始软件文件大小超过 4G 多,在安装解压缩时显示的进度百分比会不正常。


这是因为进度条数值一般是利用 NSIS 的 7z 插件的"nsis7zU::ExtractWithCallback"方法来获取进度

GetFunctionAddress $R9 ExtractCallbacknsis7zU::ExtractWithCallback "$INSTDIR\${INSTALL_7Z_NAME}" $R9
复制代码


"nsis7zU::ExtractWithCallback"方法会吐给 Callback 处理方法两个数值:当前解压缩字节数,最大字节数;通过这两个字节数的比值可以获得百分比。


问题在于这两个字节数貌似返回的是 int32 型,最大 42 亿。


如果打包的软件文件大小超过 4 个 G 多时,字节数就超过 int32 的最大值,导致溢出。


返回的最大字节数一开始就是溢出值,当前解压缩字节数逐步增大最后也会溢出,所以计算而得的百分比自然不正确了。


因为不知道 nsis7z 插件是否有新版提供 int64 返回值的支持,所以采用了一个对百分比取模的方法,一旦百分比超过 100 则舍去。

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://blog.csdn.net/qq_30795779/article/details/127428030

https://sourceforge.net/projects/nsisbi/

https://nsis.sourceforge.io/Nsis7z_plug-in

https://github.com/bajins/NSIS_SetupSkin

用户头像

大伟

关注

码龙战BUG于野。 2020-05-21 加入

还未添加个人简介

评论

发布
暂无评论
使用NSIS打包超大型软件的几个注意事项_大伟_InfoQ写作社区