NSIS安装过程中实现网络通信的几种方法

使用NSIS自定义Windows安装包时,我们有可能会遇到安装过程中需要网络功能(通信或下载)的需求。NSIS本身是没有网络功能的,要想在安装过程中实现网络功能只能通过插件和第三方软件来实现。本篇文章提供了几种方案解决NSIS的网络通信问题。

1、inetc插件

插件官方链接:inetc

插件inetc可以实现网络通信功能,支持get、post、put三种请求,满足了大部分的网络功能需求。其中inetc插件有一个特点就是通信返回的数据不能直接在NSIS中读取,都要以文件的形式保存,然后读取文件来获取通信返回的数据。这个痛点贯穿于整个NSIS的网络通信部分,目前还没有找到NSIS可以直接读取通信返回数据的插件或第三方软件。

在使用inetc插件之前有一个问题需要注意:inetc最低支持 Windows版本为Win10,不支持Win7/8。如果有兼容性考虑的话要慎用此插件,如果没有低版本兼容考虑可以比较放心的使用inetc插件。

举几个网络通信的示例

arduino 复制代码
inetc::get "https://downloadUrl/xx.file" "$TEMP\xxx.file"
// 第一个参数是文件的下载地址,第二个参数是文件下载的位置
inetc::get "https://url/pack/info" "$TEMP\xxx.txt"
// 第一个参数是文件信息的接口地址,第二个是接口返回数据的保存文件

2、NSISdl插件

插件官方链接:NSISdl

插件NSISdl支持的网络功能很少,支持的功能有:文件下载和部分get请求(作者使用中发现该插件支持部分get请求,不保险要慎用)。因此只有下载需求的可以使用此插件。

官方文档中说,NSISdl插件支持http通信不支持https通信,作者使用中发现https通信NSISdl插件也支持。

举一个网络下载的例子

php 复制代码
NSISdl::download "https://downloadUrl/xx.file" "$TEMP\xxx.file"
// 第一个参数是文件的下载地址,第二个参数是文件下载的位置

3、第三方软件

NSIS既然没有网络功能,那么在安装过程中使用第三方软件去执行网络通信(这个第三方软件可以自行编写也是开源软件)。作者采用的是NsExec插件调用curl来实现网络通信功能。

NsExec插件链接:NsExec,curl官网链接:curl

curl是一个体积小、功能强大和稳定的网络通信软件,而NsExec插件可以让NSIS运行过程中执行Windows命令行。因此作者将NSIS中的网络需求交给curl来实现,NSIS只需要进行两个工作:1、NsExec来调用curl;2、监测curl执行结果。

此方案相比上面两种方案来说功能更丰富,运行更稳定,但是由于要使用第三方软件,安装包体积会更大,而且安装过程中需要将第三方软件安装/拷贝到用户电脑之后才可以使用网络通信功能。

举几个网络通信的示例

swift 复制代码
nsExec::ExecToStack '$INSTDIR\curl\curl.exe --connect-timeout 10 -s -o "$INSTDIR\xx.file" "https://downloadUrl/xx.file"'
// 下载文件,单引号内的字符串为执行curl下载的命令行命令
Pop $2
// $2如果为0说明执行成功,不为0则说明失败
arduino 复制代码
nsExec::ExecToStack '$INSTDIR\curl\curl.exe "https://logUrl?info=xxx"'
// 发送日志,单引号内的字符串为执行curl通信的命令行命令
rust 复制代码
nsExec::ExecToStack '$INSTDIR\curl\curl.exe --connect-timeout 10 -s -o "$TEMP\getUrl.txt" "https://getUrl"'
// 获取信息,单引号内的字符串为执行curl通信的命令行命令,接口返回值保存在来geturl.txt

上述就是作者总结的三种实现NSIS安装过程中进行网络通信的方法。

相关推荐
库拉镜像AI牛牛4 分钟前
短剧内容自动化生产:知漫剧工作室落地教程
大数据·服务器·前端·人工智能·语音识别
律宏阔5 分钟前
Flutter 列表图片内存优化:CachedNetworkImage 与 ClipRRect 的取舍
前端·flutter
行者全栈架构师6 分钟前
【鸿蒙心迹】相册文搜图工程化落地:HarmonyOS 7.0 端侧 AI 检索全链路实战与 5 个踩坑解法
前端
律宏阔16 分钟前
Dart 3 Record:解决 Future.wait 异构返回值的类型问题
前端·flutter
Seraphina3625 分钟前
DVWA(XSS Reflected/Stored High,CSRF Low)
前端·xss·csrf
默_笙1 小时前
🍔 中间件不只是打日志:四个钩子、一次短路,和自带的工具
前端·javascript
程序员老赵2 小时前
Docker 部署 Dolibarr:轻松搭建开源 ERP/CRM 平台
运维·前端·后端
星禾元亨2 小时前
同一件事有三份资料,AI 该信哪一份?冲突判定、优先级链与处置流程
前端·人工智能
Dovis(誓平步青云)2 小时前
家里设备越来越多,如何用一张空间地图控制灯光和温度![
android·java·前端·javascript·人工智能·电脑
穆梓兰煊2 小时前
TS5.7 vs 裸JS:AI应用少3坑
前端