杉宫竹苑工作室

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1982|回复: 0

NSIS 制作软件升级安装包完整教程

[复制链接]
发表于 2016-5-21 14:31:51 | 显示全部楼层 |阅读模式

正式会员享受无限制浏览网站功能和高速网盘下载,赶快加入本站吧!

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 Share 于 2017-8-27 02:28 编辑

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

第一步:定义基本框架

  1. !define PRODUCT_NAME "a"
  2. !define PRODUCT_VERSION "1.0.0.1"
  3. SetCompressor lzma
  4. SetFont "tahoma" 8
  5. RequestExecutionLevel admin
  6. !include "MUI2.nsh"
  7. !insertmacro MUI_LANGUAGE "SimpChinese"
  8. Name "${PRODUCT_NAME}_升级_${PRODUCT_VERSION}"
  9. OutFile "${PRODUCT_NAME}_升级_${PRODUCT_VERSION}.exe"
  10. InstallDirRegKey HKCU "Software\a" ""
  11. Section "升级文件" SEC01
  12. SetDetailsPrint textonly DetailPrint "正在升级 ${PRODUCT_NAME},请单击关闭按钮完成升级!"
  13. SetDetailsPrint listonly

  14. SectionIn RO
  15. SetOutPath "$INSTDIR"
  16. SetOverwrite ifnewer ;升级文件File "a.EXE" File "Server\更新说明.txt"
  17. ;运行BTA
  18. nsExec::Exec "$INSTDIR\a.bat"
  19. ;指定以记事本打开说明
  20. Exec '"$SYSDIR\notepad.exe" "$INSTDIR\更新说明.txt"'

  21. SectionEnd

复制代码


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

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

第二步:禁止重复运行
在.onInit区段加入以下代码

  1. InitPluginsDir
  2. ;创建互斥防止重复运行
  3. System::Call 'kernel32::CreateMutexA(i 0, i 0, t "ainstaller") 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\a" ""
  3. StrCmp $0 "" 0
  4. NoAbort
  5. MessageBox MB_OK|MB_ICONEXCLAMATION "您未正确安装本软件,不能使用此升级程序!"

  6. Abort
  7. ;退出安装程序
  8. NoAbort:

复制代码


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


在.onInit区段加入以下代码

  1. ;关闭进程
  2. Push $R0
  3. CheckProc: Push "asc.exe"
  4. ProcessWork::existsprocess Pop $R0
  5. IntCmp $R0 0
  6. Done
  7. MessageBox MB_OKCANCEL|MB_ICONSTOP "升级程序检测到 ${PRODUCT_NAME} 正在运行。$\r$\n$\r$\n点击 “确定” 强制关闭${PRODUCT_NAME},继续升级。$\r$\n点击 “取消” 退出安装程序。" IDCANCEL Exit Push "asc.exe" Processwork::KillProcess Sleep 1000 Goto CheckProc Exit: Abort Done: Pop $R0
复制代码


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

第五步:添加MUI
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|手机版|Archiver|SgzyStudio

GMT+8, 2024-5-17 23:46 , Processed in 0.110569 second(s), 23 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表