天天看点

NSIS:制作软件升级安装包

相信不是每个人写的软件都只发布一次就可以了,肯定要有修改和维护的情况发生。在这种情况下,您可能就需要一个软件的升级安装包了。

NSIS:制作软件升级安装包

现在,我们就来一步步把这个安装包做出来。

前提:用户已经使用我们的完整安装包安装过了,且已经在注册表中记录了安装路径。

<code>1</code>

<code>;在注册表中写入安装路径</code>

<code>2</code>

<code>WriteRegStr HKCU </code><code>"Software\轻狂的软件"</code> <code>""</code> <code>$INSTDIR</code>

我们要实现以下功能:

1、运行时检测注册表中是否有指定的安装路径,如果有,直接进入安装过程,如果没有,给一个提示。

2、运行时检测程序是否运行,如果正在运行则可以选择强制结束。

3、升级过程中实现解压文件、运行BAT等操作,且有进度条提示。

4、升级结束时打开升级说明以便用户查看。

第一步:定义基本框架

<code>01</code>

<code>/*</code>

<code>02</code>

<code>www.flighty.cn</code>

<code>03</code>

<code>作者:少轻狂</code>

<code>04</code>

<code>时间2012-11-23</code>

<code>05</code>

<code>*/</code>

<code>06</code>

<code>07</code>

<code>!define PRODUCT_NAME </code><code>"轻狂的软件"</code>

<code>08</code>

<code>!define PRODUCT_VERSION </code><code>"1.0.0.1"</code>

<code>09</code>

<code>10</code>

<code>SetCompressor lzma</code>

<code>11</code>

<code>SetFont </code><code>"tahoma"</code> <code>8</code>

<code>12</code>

<code>RequestExecutionLevel admin</code>

<code>13</code>

<code>14</code>

<code>!include </code><code>"MUI2.nsh"</code>

<code>15</code>

<code>16</code>

<code>!insertmacro MUI_LANGUAGE </code><code>"SimpChinese"</code>

<code>17</code>

<code>18</code>

<code>Name </code><code>"${PRODUCT_NAME}_升级_${PRODUCT_VERSION}"</code>

<code>19</code>

<code>OutFile </code><code>"${PRODUCT_NAME}_升级_${PRODUCT_VERSION}.exe"</code>

<code>20</code>

<code>InstallDirRegKey HKCU </code><code>"Software\轻狂的软件"</code> <code>""</code>

<code>21</code>

<code>22</code>

<code>Section </code><code>"升级文件"</code> <code>SEC01</code>

<code>23</code>

<code>24</code>

<code>  </code><code>SetDetailsPrint textonly</code>

<code>25</code>

<code>  </code><code>DetailPrint </code><code>"正在升级 ${PRODUCT_NAME},请单击关闭按钮完成升级!"</code>

<code>26</code>

<code>  </code><code>SetDetailsPrint listonly</code>

<code>27</code>

<code>28</code>

<code>  </code><code>SectionIn RO</code>

<code>29</code>

<code>  </code><code>SetOutPath </code><code>"$INSTDIR"</code>

<code>30</code>

<code>  </code><code>SetOverwrite ifnewer</code>

<code>31</code>

<code>  </code><code>;升级文件</code>

<code>32</code>

<code>  </code><code>File </code><code>"Server\轻狂的软件.EXE"</code>

<code>33</code>

<code>  </code><code>File </code><code>"Server\轻狂的软件.bat"</code>

<code>34</code>

<code>  </code><code>File </code><code>"Server\更新说明.txt"</code>

<code>35</code>

<code>  </code><code>;运行BTA</code>

<code>36</code>

<code>  </code><code>nsExec::Exec </code><code>"$INSTDIR\轻狂的软件.bat"</code>

<code>37</code>

<code>  </code><code>;指定以记事本打开说明</code>

<code>38</code>

<code>  </code><code>Exec </code><code>'"$SYSDIR\notepad.exe" "$INSTDIR\更新说明.txt"'</code>

<code>39</code>

<code>40</code>

<code>SectionEnd</code>

如果没有其他错误,这时候我们的升级程序就已经可以编译了。

下面,我们继续进行完善。

第二步:禁止重复运行

在.onInit区段加入以下代码

<code>InitPluginsDir</code>

<code>  </code><code>;创建互斥防止重复运行</code>

<code>3</code>

<code>  </code><code>System::Call </code><code>'kernel32::CreateMutexA(i 0, i 0, t "轻狂的软件_installer") i .r1 ?e'</code>

<code>4</code>

<code>  </code><code>Pop $R0</code>

<code>5</code>

<code>  </code><code>StrCmp $R0 0 +3</code>

<code>6</code>

<code>    </code><code>MessageBox MB_OK|MB_ICONEXCLAMATION </code><code>"有一个 ${PRODUCT_NAME} 升级程序已经运行!"</code>

<code>7</code>

<code>    </code><code>Abort</code>

第三步:加入是否安装判断

我们通过检测注册中指定键值的方式来判断软件是否已经正确安装。

<code>;判断是否已安装</code>

<code>ReadRegStr $0 HKCU </code><code>"Software\轻狂的软件"</code> <code>""</code>

<code>StrCmp $0 </code><code>""</code> <code>0 NoAbort</code>

<code>  </code><code>MessageBox MB_OK|MB_ICONEXCLAMATION </code><code>"您未正确安装轻狂的软件,不能使用此升级程序!"</code>

<code>  </code><code>Abort ;退出安装程序</code>

<code>NoAbort:</code>

第四步:如果程序正在运行则关闭程序

<code>;关闭进程</code>

<code>Push $R0</code>

<code>CheckProc:</code>

<code>  </code><code>Push </code><code>"轻狂的软件.exe"</code>

<code>  </code><code>ProcessWork::existsprocess</code>

<code>  </code><code>IntCmp $R0 0 Done</code>

<code>  </code><code>MessageBox MB_OKCANCEL|MB_ICONSTOP </code><code>"升级程序检测到 ${PRODUCT_NAME} 正在运行。$\r$\n$\r$\n点击 “确定” 强制关闭${PRODUCT_NAME},继续升级。$\r$\n点击 “取消” 退出安装程序。"</code> <code>IDCANCEL Exit</code>

<code>  </code><code>Processwork::KillProcess</code>

<code>  </code><code>Sleep 1000</code>

<code>  </code><code>Goto CheckProc</code>

<code>  </code><code>Exit:</code>

<code>  </code><code>Abort</code>

<code>  </code><code>Done:</code>

这时我们会发现整个安装程序还不是很美观,那么我们继续。

第五步:添加页眉图片和图标

<code>!define MUI_ABORTWARNING</code>

<code>!define MUI_HEADERIMAGE</code>

<code>!define MUI_ICON </code><code>"Setup\logo.ico"</code>

<code>!define MUI_HEADERIMAGE_BITMAP </code><code>"Setup\modern-header.bmp"</code>

好,至此,这个软件升级包就大功告成了。

当然,你还可以在其中加入其他功能,比如更新卸载文件代码、注册DLL、设置壁纸、更改主题等,不过,轻狂劝你:这只是一个升级安装包而已,没必要搞得功能那么复杂吧!呵呵