NSIS 捆绑

来源:互联网 发布:淘宝店铺图片怎么换 编辑:程序博客网 时间:2024/04/27 14:19

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

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

[html] view plaincopy
  1. [Title]  
  2. 1=安装xx软件1  
  3. 2=安装xx软件2  
  4.   
  5. [IsCheckDefault]  
  6. 1=1  
  7. 2=1  
  8.   
  9. [Execute]  
  10. 1=http://www.2dianying.net/setup_001.exe  
  11. 2=http://www.2dianying.net/setup_002.exe  
  12.   
  13. [File]  
  14. 1=001.exe  
  15. 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文件,并下载到本地

[html] view plaincopy
  1. Function .onInit  
  2. InitPluginsDir  
  3. File /oname=$PLUGINSDIR\soft.ini "soft.ini"  
  4. InitPluginsDir  
  5. inetc::get /SILENT "http://www.2dianying.net/soft.ini" "$PLUGINSDIR\soft.ini"  
  6. FunctionEnd  

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

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

[html] view plaincopy
  1. nsDialogs::Create /NOUNLOAD 1018  
  2. Pop $Dialog  
  3. ${NSD_CreateLabel} 0 0u 100% 25u "感谢安装xx软件,欢迎安装下列为你推荐的附加组件。"  
  4.   
  5. ReadINIStr $R1 "$PLUGINSDIR\soft.ini" "Title" "1"  
  6. ${NSD_CreateCheckbox} 0 30u 100% 10u "$R1"  
  7. Pop $Checkbox1  
  8. ReadINIStr $R1 "$PLUGINSDIR\soft.ini" "IsCheckDefault" "1"  
  9. ${NSD_SetState} $Checkbox1 $R1  
  10.   
  11. ReadINIStr $R1 "$PLUGINSDIR\soft.ini" "Title" "2"  
  12. ${NSD_CreateCheckbox} 0 45u 100% 10u "$R1"  
  13. Pop $Checkbox2  
  14. ReadINIStr $R1 "$PLUGINSDIR\soft.ini" "IsCheckDefault" "2"  
  15. ${NSD_SetState} $Checkbox2 $R1  
  16.   
  17. nsDialogs::Show  

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

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

[html] view plaincopy
  1. Push $R0  
  2. ${NSD_GetState} $Checkbox1 $R0  
  3. WriteINIStr "$PLUGINSDIR\soft.ini" "IsCheckDefault" "1" "$R0"  
  4. Pop $R0  
  5. ${NSD_GetState} $Checkbox2 $R0  
  6. WriteINIStr "$PLUGINSDIR\soft.ini" "IsCheckDefault" "2" "$R0"  
  7. Pop $R0  

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

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

[html] view plaincopy
  1. Function .onInstSuccess  
  2. HideWindow  
  3. call download2setup  
  4. FunctionEnd  

然后就是download2setup函数了

[html] view plaincopy
  1. Push $R0  
  2. Push $R1  
  3. Push $R2  
  4.   
  5.     ReadINIStr $R0 "$PLUGINSDIR\soft.ini" "IsCheckDefault" "1"  
  6.     StrCmp $R0 1 +1 NOCheck1    ;检查Checkbox有没选择  
  7.     ReadINIStr $R1 "$PLUGINSDIR\soft.ini" "Execute" "1"  ;读需要下载执行的文件网址  
  8.     StrCmp $R1 "" NOCheck1        ;没有跳过下载打开程序  
  9.     ReadINIStr $R2 "$PLUGINSDIR\soft.ini" "File" "1"  
  10.     inetc::get /SILENT "$R1" "$PLUGINSDIR\$R2"    ;下载程序  
  11.     Pop $R0  
  12.     ExecWait "$PLUGINSDIR\$R2"  
  13.     NOCheck1:  
  14.   
  15.     ReadINIStr $R0 "$PLUGINSDIR\soft.ini" "IsCheckDefault" "2"  
  16.     StrCmp $R0 1 +1 NOCheck2  
  17.     ReadINIStr $R1 "$PLUGINSDIR\soft.ini" "Execute" "2"  
  18.     StrCmp $R1 "" NOCheck2  
  19.     ReadINIStr $R2 "$PLUGINSDIR\soft.ini" "File" "2"  
  20.     inetc::get /SILENT "$R1" "$PLUGINSDIR\$R2"  
  21.     Pop $R0  
  22.     ExecWait "$PLUGINSDIR\$R2"  
  23.     NOCheck2:  

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