相信不是每个人写的软件都只发布一次就可以了,肯定要有修改和维护的情况发生。在这种情况下,您可能就需要一个软件的升级安装包了。
现在,我们就来一步步把这个安装包做出来。
前提:用户已经使用我们的完整安装包安装过了,且已经在注册表中记录了安装路径。
<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、设置壁纸、更改主题等,不过,轻狂劝你:这只是一个升级安装包而已,没必要搞得功能那么复杂吧!呵呵