NSIS 捆绑

最近要用nsis打包一个软件,大家都知道的,自由免费软件现在很难生存下去,只能靠捆绑其他cpa软件才能生存,这也是现实的无奈,谁都不想这样做,但是国内环境如此,谁都不想付费使用软件,那只能在安装的时候推荐一些有偿安装的软件了,闲话少说,直接上干货。

首先要制作定义cpa下载连接的远程ini文件,可能有些朋友想问,为什么不把第三方软件一起打包呢,非要用远程配置文件配置链接地址去下载吗?这个我稍微罗嗦一下,第三方的cpa也很坑爹的,不是说你打包进去,就永远会给你收益的,所以要通过远程配置文件去配置,远程ini文件如下:

[Title] 
1=安装xx软件1 
2=安装xx软件2 
 
[IsCheckDefault] 
1=1 
2=1 
 
[Execute] 
1=http://www.yhxs3344.net.net/setup_001.exe 
2=http://www.yhxs3344.net.net/setup_002.exe 
 
[File] 
1=001.exe 
2=002.exe

解释一下,title,就是软件名称了,ischeckdefault是软件前面要放一个checkbox框,可以让安装的人勾选的,有人不喜欢,就可以取消掉,file就是下载到本机的文件名,这个也有讲究的,很多cpa,你的pid就在文件名上,比如setup_001.exe,你的pid就是001,如果你把这个001去掉,就不算你推广的安装了,当然也就拿不到佣金了。最重要的就是execute,就是软件的下载地址了,当然这里只是提供个例子,实际地址并没有这些文件。

然后就是nsis这边的代码了,我不打算把全部代码都贴出来,选几个重点讲一下,首先是读这个ini文件以及显示这个特别的安装页面。

要制作自定义的安装界面,就要用到nsdialogs,所以要在include区,你搜索include,就能找到这个区块,加上:

!include “nsdialogs.nsh”

然后定义自定义页面需要用的函数

Page custom 函数1 函数2 …;函数名自己命名,多个函数按顺序定义,就会按顺序调用,用空格隔开

然后读取文件,下载文件要用inetc插件,这个搜nsis插件,到处都是

这两个前提条件准备好了,先读取远程ini文件,并下载到本地

Function .onInit 
InitPluginsDir 
File /oname=$PLUGINSDIR\soft.ini "soft.ini" 
InitPluginsDir 
inetc::get /SILENT "http://www.yhxs3344.net.net/soft.ini" "$PLUGINSDIR\soft.ini" 
FunctionEnd

解释一下,inetc:get就是上面提到的inetc插件,把远程文件下载到本地,这个操作最好放到oninit函数里

接下来就根据这个ini文件的配置,去画这个自定义的安装页了

nsDialogs::Create /NOUNLOAD 1018 
Pop $Dialog 
${NSD_CreateLabel} 0 0u 100% 25u "感谢安装xx软件,欢迎安装下列为你推荐的附加组件。" 
 
ReadINIStr $R1 "$PLUGINSDIR\soft.ini" "Title" "1" 
${NSD_CreateCheckbox} 0 30u 100% 10u "$R1" 
Pop $Checkbox1 
ReadINIStr $R1 "$PLUGINSDIR\soft.ini" "IsCheckDefault" "1" 
${NSD_SetState} $Checkbox1 $R1 
 
ReadINIStr $R1 "$PLUGINSDIR\soft.ini" "Title" "2" 
${NSD_CreateCheckbox} 0 45u 100% 10u "$R1" 
Pop $Checkbox2 
ReadINIStr $R1 "$PLUGINSDIR\soft.ini" "IsCheckDefault" "2" 
${NSD_SetState} $Checkbox2 $R1 
 
nsDialogs::Show

一头一尾,都调用了nsdialogs的方法,这是重点,要不然没法做出自定义的安装页,中间代码比较好理解,不多解释,就是生成checkbox以及读取软件标题,还有就是是否默认勾选的选项

关键的一步到了,读取用户勾选的信息,并写到ini文件里,为后面判断是否要下载并安装cpa做准备。

Push $R0 
${NSD_GetState} $Checkbox1 $R0 
WriteINIStr "$PLUGINSDIR\soft.ini" "IsCheckDefault" "1" "$R0" 
Pop $R0 
${NSD_GetState} $Checkbox2 $R0 
WriteINIStr "$PLUGINSDIR\soft.ini" "IsCheckDefault" "2" "$R0" 
Pop $R0

好像也不用解释了,代码非常清晰,就是读取checkbox勾选状态,然后写入到ischeckdefault字段区,这个字段复用了

最后就是下载勾选的软件并安装,这个步骤一定要放在.onInstSuccess函数里,并且在执行下载安装的操作前,使用HideWindow命令,要不然,整个安装界面会卡在那里,直到所有下载和安装都结束才会响应,这是非常糟糕的。

Function .onInstSuccess 
HideWindow 
call download2setup 
FunctionEnd

然后就是download2setup函数了

Push $R0 
Push $R1 
Push $R2 
 
 ReadINIStr $R0 "$PLUGINSDIR\soft.ini" "IsCheckDefault" "1" 
 StrCmp $R0 1 +1 NOCheck1 ;检查Checkbox有没选择 
 ReadINIStr $R1 "$PLUGINSDIR\soft.ini" "Execute" "1" ;读需要下载执行的文件网址 
 StrCmp $R1 "" NOCheck1 ;没有跳过下载打开程序 
 ReadINIStr $R2 "$PLUGINSDIR\soft.ini" "File" "1" 
 inetc::get /SILENT "$R1" "$PLUGINSDIR\$R2" ;下载程序 
 Pop $R0 
 ExecWait "$PLUGINSDIR\$R2" 
 NOCheck1: 
 
 ReadINIStr $R0 "$PLUGINSDIR\soft.ini" "IsCheckDefault" "2" 
 StrCmp $R0 1 +1 NOCheck2 
 ReadINIStr $R1 "$PLUGINSDIR\soft.ini" "Execute" "2" 
 StrCmp $R1 "" NOCheck2 
 ReadINIStr $R2 "$PLUGINSDIR\soft.ini" "File" "2" 
 inetc::get /SILENT "$R1" "$PLUGINSDIR\$R2" 
 Pop $R0 
 ExecWait "$PLUGINSDIR\$R2" 
 NOCheck2:

至此,就完成这个功能了,就不发那个捆绑了很多软件的安装界面的截图了,你痛恨,我也痛恨,要不是为了生存,谁没事捆什么浏览器播放器游戏加速器什么的,太讨厌了。

© 版权声明
THE END
喜欢就支持一下吧
点赞7 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容