原文 NSIS:制作软件升级安装包

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

 
现在,我们就来一步步把这个安装包做出来。
 
前提:用户已经使用我们的完整安装包安装过了,且已经在注册表中记录了安装路径。
 
1 ;在注册表中写入安装路径
2 WriteRegStr HKCU "Software\轻狂的软件" "" $INSTDIR

 
我们要实现以下功能:
1、运行时检测注册表中是否有指定的安装路径,如果有,直接进入安装过程,如果没有,给一个提示。
2、运行时检测程序是否运行,如果正在运行则可以选择强制结束。
3、升级过程中实现解压文件、运行BAT等操作,且有进度条提示。
4、升级结束时打开升级说明以便用户查看。


第一步:定义基本框架

01 /*
02 www.flighty.cn
03 作者:少轻狂
04 时间2012-11-23
05 */
06  
07 !define PRODUCT_NAME "轻狂的软件"
08 !define PRODUCT_VERSION "1.0.0.1"
09  
10 SetCompressor lzma
11 SetFont "tahoma" 8
12 RequestExecutionLevel admin
13  
14 !include "MUI2.nsh"
15  
16 !insertmacro MUI_LANGUAGE "SimpChinese"
17  
18 Name "${PRODUCT_NAME}_升级_${PRODUCT_VERSION}"
19 OutFile "${PRODUCT_NAME}_升级_${PRODUCT_VERSION}.exe"
20 InstallDirRegKey HKCU "Software\轻狂的软件" ""
21  
22 Section "升级文件" SEC01
23  
24   SetDetailsPrint textonly
25   DetailPrint "正在升级 ${PRODUCT_NAME},请单击关闭按钮完成升级!"
26   SetDetailsPrint listonly
27  
28   SectionIn RO
29   SetOutPath "$INSTDIR"
30   SetOverwrite ifnewer
31   ;升级文件
32   File "Server\轻狂的软件.EXE"
33   File "Server\轻狂的软件.bat"
34   File "Server\更新说明.txt"
35   ;运行BTA
36   nsExec::Exec "$INSTDIR\轻狂的软件.bat"
37   ;指定以记事本打开说明
38   Exec '"$SYSDIR\notepad.exe" "$INSTDIR\更新说明.txt"'
39  
40 SectionEnd
 
如果没有其他错误,这时候我们的升级程序就已经可以编译了。
 
下面,我们继续进行完善。
 

二步:禁止重复运行

在.onInit区段加入以下代码
 
1 InitPluginsDir
2   ;创建互斥防止重复运行
3   System::Call 'kernel32::CreateMutexA(i 0, i 0, t "轻狂的软件_installer") i .r1 ?e'
4   Pop $R0
5   StrCmp $R0 0 +3
6     MessageBox MB_OK|MB_ICONEXCLAMATION "有一个 ${PRODUCT_NAME} 升级程序已经运行!"
7     Abort
 

第三步:加入是否安装判断
 
我们通过检测注册中指定键值的方式来判断软件是否已经正确安装。
 
在.onInit区段加入以下代码
 
1 ;判断是否已安装
2 ReadRegStr $0 HKCU "Software\轻狂的软件" ""
3 StrCmp $0 "" 0 NoAbort
4   MessageBox MB_OK|MB_ICONEXCLAMATION "您未正确安装轻狂的软件,不能使用此升级程序!"
5   Abort ;退出安装程序
6 NoAbort:
 

第四步:如果程序正在运行则关闭程序
 
在.onInit区段加入以下代码
 
01 ;关闭进程
02 Push $R0
03 CheckProc:
04   Push "轻狂的软件.exe"
05   ProcessWork::existsprocess
06   Pop $R0
07   IntCmp $R0 0 Done
08   MessageBox MB_OKCANCEL|MB_ICONSTOP "升级程序检测到 ${PRODUCT_NAME} 正在运行。$\r$\n$\r$\n点击 “确定” 强制关闭${PRODUCT_NAME},继续升级。$\r$\n点击 “取消” 退出安装程序。" IDCANCEL Exit
09   Push "轻狂的软件.exe"
10   Processwork::KillProcess
11   Sleep 1000
12   Goto CheckProc
13   Exit:
14   Abort
15   Done:
16   Pop $R0
 
这时我们会发现整个安装程序还不是很美观,那么我们继续。
 

第五步:添加页眉图片和图标
 
1 !define MUI_ABORTWARNING
2 !define MUI_HEADERIMAGE
3 !define MUI_ICON "Setup\logo.ico"
4 !define MUI_HEADERIMAGE_BITMAP "Setup\modern-header.bmp"
 
好,至此,这个软件升级包就大功告成了。
 
当然,你还可以在其中加入其他功能,比如更新卸载文件代码、注册DLL、设置壁纸、更改主题等,不过,轻狂劝你:这只是一个升级安装包而已,没必要搞得功能那么复杂吧!呵呵

NSIS:制作软件升级安装包的更多相关文章

  1. 使用NSIS制作可执行程序的安装包

    使用NSIS制作可执行程序的安装包: 1,NSIS下载地址:https://pan.baidu.com/s/1GzzQNXgAlJPJWgjBzVwceA 下载完成之后解压缩,打开安装程序,默认安装即 ...

  2. 制作linux内核安装包

    实验基于Centos 6.2 升级linux内核 直接在一个有编译环境的设备上,编译升级内核很简单. make menuconfig 或者 拷贝现有系统的.config文件 修改.config文件  ...

  3. IS2009制作Oracle 静默安装包(二) 感谢空白先生特许授权

    原文:IS2009制作Oracle 静默安装包(二) 感谢空白先生特许授权 上一篇: IS2009制作Oracle 静默安装包(一)感谢空白先生特许授权本文经原作者特许授权于海洋女神发布,转载请务必注 ...

  4. IS2009制作Oracle 静默安装包(一)感谢空白先生特许授权

    原文:IS2009制作Oracle 静默安装包(一)感谢空白先生特许授权 上一篇: MyEclipse中消除frame引起的“the file XXX can not be found.Please ...

  5. Advanced Installer 制作.NetWeb部署安装包

    原文:Advanced Installer 制作.NetWeb部署安装包 因为是.Net的Web应用程序,所以想用Advanced Installer 调用Dll实现安装部署. 因为我需要自己定制参数 ...

  6. 制作iis自动安装包

    原文:制作iis自动安装包 MS 一直没有提供可独立安装的 IIS 安装包,Windows 的缺省安装没有安装它,通常要到控制面板的"添加/删除 Windows 程序"中去选择安装 ...

  7. 用Inno Setup制作WEB程序安装包

    原文 用Inno Setup制作WEB程序安装包 最近做了一个WEB程序的安装包,我把制作的过程做个介绍,贴出源码给大家做个参考 看看inno 的脚本 [Setup] AppCopyright=tes ...

  8. C# 制作Windows服务安装包

    C# 制作Windows服务安装包   这两天公司要用C#写一个windows服务,做成安装安装包.制作的过程中遇到了一些问题,写完之后总结一下.如果以后在用到的话可以可以参考一下,而且由于原来没有做 ...

  9. InstallShield制作升级安装包

    1. 在General Information里,修改Product Version为新的版本号,此版本号应大于旧的版本号.点击Product Code右面的{...},获取一个新的Product C ...

随机推荐

  1. Android kxml解析WBXML

     WAP Binary XML定义好XML片断表述出同步server地址.远程数据库名称.登录账号等等内容一.两种訪问方法: 眼下的kxml支持两种wap格式:WBXML/WML. 而有两种方法将解析 ...

  2. JSP生成word文件

    1.jsp生成word文件,直接改动jsp格式: <%@ page contentType="application/vnd.ms-word;charset=GB2312"% ...

  3. oracle 包,函数,过程,块的创建和执行及在java中执行(转)

    SQL> create or replace procedure sp_guocheng1 is--如果有这个名字就替换  2  begin--执行部分  3  insert into guoc ...

  4. 如何利用多核CPU来加速你的Linux命令 — awk, sed, bzip2, grep, wc等(转)

    你是否曾经有过要计算一个非常大的数据(几百GB)的需求?或在里面搜索,或其它操作——一些无法并行的操作.数据专家们,我是在对你们说.你可能有一个4核或更多核的CPU,但我们合适的工具,例如 grep, ...

  5. CSDN挑战编程——《金色十月线上编程比赛第二题:解密》

    金色十月线上编程比赛第二题:解密 题目详情: 小强是一名学生, 同一时候他也是一个黑客. 考试结束后不久.他吃惊的发现自己的高等数学科目竟然挂了,于是他果断入侵了学校教务部站点. 在入侵的过程中.他发 ...

  6. C++ Primer 学习笔记_40_STL实践与分析(14)--概要、先来看看算法【上】

    STL实践与分析 --概述.初窥算法[上]     标准库容器定义的操作很少.并没有给容器加入大量的功能函数.而是选择提供一组算法,这些算法大都不依赖特定的容器类型,是"泛型"的. ...

  7. 小米2S 中文和英文支持TWRP,真实双系统支持

    经过我几天的努力小米2S的TWRP 的功能已经完美了. 支持功能 : 中文和英文显示能相互切换 真实双系统功能已经完成95%. 刷入手机方法.由于时间原因我只制作了img文件.没有制作成卡刷包格式. ...

  8. Echache整合Spring缓存实例讲解(转)

    林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 摘要:本文主要介绍了EhCache,并通过整合Spring给出了一个使用实例. 一.EhCac ...

  9. logback与Spring、SpringMVC结合使用教程(转) logback good

    摘要:本文主要介绍了如何在spring.springMVC中使用logback 一.logback与Spirng结合使用 1.maven添加引用: <dependency> <gro ...

  10. 设计师给了px显着的单位,Android要设置多少开发商dip、dp、sp?

    此链接    http://blog.csdn.net/xiaodongrush/article/details/29560431 1. 要开发一款Android APP,设计师和开发要约定哪些事情? ...