杉宫竹苑工作室

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

提供修复界面的NSIS安装包

[复制链接]
发表于 2016-9-2 20:12:21 | 显示全部楼层 |阅读模式

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

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

x
  1. !include "LogicLib.nsh"

  2. ; 安装背景及文字
  3. !define PRODUCT_TEXT_KEY "(邦畿千里)"
  4. !define PRODUCT_TEXT_BACK "resource/back.bmp"
  5. !define PRODUCT_TEXT_PROXCY "现无偿提供给NSIS爱好者使用!"
  6. !define PRODUCT_TEXT_TEL "QQ:911137"
  7. !define PRODUCT_TEXT_AREA "1.自动监测,修复,安装,删除!"
  8. !define PRODUCT_TEXT_INTRUDUCE "2.自由替换图片、背景,注册动态库,执行Exe多种功能!"


  9. ; 安装程序初始定义常量
  10. !define PRODUCT_PATH "邦畿千里系列软件"
  11. !define PRODUCT_NAME "邦畿千里画图软件"
  12. !define PRODUCT_MAINEXE "mspaint.exe"
  13. !define PRODUCT_VERSION "2008"
  14. !define PRODUCT_PUBLISHER "邦畿千里"
  15. !define PRODUCT_WEB_SITE "http://www.baidu.com"
  16. !define PRODUCT_REGRUN "Software/Microsoft/Windows/CurrentVersion/Run"
  17. !define PRODUCT_DIR_REGKEY "Software/Microsoft/Windows/CurrentVersion/App Paths/${PRODUCT_PUBLISHER}/${PRODUCT_NAME}"
  18. !define PRODUCT_UNINST_KEY "Software/Microsoft/Windows/CurrentVersion/Uninstall/${PRODUCT_TEXT_KEY}${PRODUCT_NAME}"
  19. !define PRODUCT_UNINST_ROOT_KEY "HKLM"

  20. SetCompressor lzma

  21. ; ------ MUI 现代界面定义 (1.67 版本以上兼容) ------
  22. !include "MUI.nsh"

  23. ; MUI 预定义常量
  24. ;--------------------------------
  25. ;Interface Configuration
  26. !define MUI_ABORTWARNING
  27. ;安装图标
  28. !define MUI_ICON "resource/install.ico"
  29. ;卸载图标
  30. !define MUI_UNICON "resource/uninstall.ico"
  31. ;上部图片
  32. !define MUI_HEADERIMAGE
  33. !define MUI_HEADERIMAGE_BITMAP "resource/header.bmp"
  34. ;左侧图片
  35. !define MUI_WELCOMEFINISHPAGE_BITMAP "resource/left.bmp"
  36. !define MUI_WELCOMEFINISHPAGE_BITMAP_NOSTRETCH
  37. !define MUI_UNWELCOMEFINISHPAGE_BITMAP "resource/left.bmp"
  38. !define MUI_UNWELCOMEFINISHPAGE_BITMAP_NOSTRETCH
  39. ;页面加载之前进行初始化
  40. !define MUI_CUSTOMFUNCTION_GUIINIT ".onGUIBegin"

  41. ;-------------修复页面变量定义-----------------------
  42. !include nsDialogs.nsh
  43. Var UninstallFileName
  44. Var RADIO_REPAIR
  45. Var RADIO_REMOVE
  46. Var Checkbox_State_REPAIR
  47. Var Checkbox_State_REMOVE
  48. Var Checkbox_State

  49. ;-------------页面定义---------------------------
  50. ; 欢迎页面
  51. !insertmacro MUI_PAGE_WELCOME
  52. ; 修复页面
  53. Page custom nsDialogsRepair nsDialogsRepairLeave
  54. ; 许可协议页面
  55. !insertmacro MUI_PAGE_LICENSE "resource/licence.txt"
  56. ; 安装目录选择页面
  57. !insertmacro MUI_PAGE_DIRECTORY
  58. ; 安装过程页面
  59. !insertmacro MUI_PAGE_INSTFILES
  60. ; 安转完成后自动运行文件
  61. !define MUI_FINISHPAGE_RUN "$INSTDIR/${PRODUCT_MAINEXE}"
  62. ; 安装完成页面
  63. !insertmacro MUI_PAGE_FINISH
  64. ; 安装卸载确认页面
  65. !insertmacro MUI_UNPAGE_CONFIRM
  66. ; 安装卸载过程页面
  67. !insertmacro MUI_UNPAGE_INSTFILES
  68. ; 安装卸载完成页面
  69. !insertmacro MUI_UNPAGE_FINISH
  70. ; 安装预释放文件
  71. !insertmacro MUI_RESERVEFILE_INSTALLOPTIONS
  72. ; 安装界面包含的语言设置
  73. !insertmacro MUI_LANGUAGE "SimpChinese"
  74. ; ------ MUI 现代界面定义结束 ------

  75. Name "${PRODUCT_NAME} ${PRODUCT_VERSION}"
  76. OutFile "${PRODUCT_NAME} ${PRODUCT_VERSION}.exe"
  77. InstallDir "$PROGRAMFILES/${PRODUCT_PATH}/${PRODUCT_NAME}"
  78. InstallDirRegKey HKLM "${PRODUCT_UNINST_KEY}" "UninstallString"
  79. ShowInstDetails hide
  80. ShowUnInstDetails hide
  81. BrandingText ${PRODUCT_PUBLISHER}

  82. ; 激活安装日志记录,该日志文件将会作为卸载文件的依据(注意,本区段必须放置在所有区段之前)
  83. Section "-LogSetOn"
  84.   LogSet on
  85. SectionEnd

  86. Section "!主程序" SEC01
  87.   SectionIn RO
  88.   SetOutPath "$INSTDIR"
  89.   SetOverwrite ifnewer
  90.   CreateDirectory "$SMPROGRAMS/${PRODUCT_PATH}/${PRODUCT_NAME}"
  91.   ; 创建开始菜单快捷方式
  92.   CreateShortCut "$SMPROGRAMS/${PRODUCT_PATH}/${PRODUCT_NAME}/${PRODUCT_NAME}.lnk" "$INSTDIR/${PRODUCT_MAINEXE}"
  93.   ; 创建桌面快捷方式
  94.   CreateShortCut "$DESKTOP/${PRODUCT_NAME}.lnk" "$INSTDIR/${PRODUCT_MAINEXE}"
  95.   File "Program/Main/mspaint.exe"
  96. SectionEnd

  97. Section "-系统文件" SEC02
  98.   SectionIn RO
  99.   ; 关闭日志,以保证不被卸载掉,主要用于公用文件
  100.   LogSet off
  101.   SetOutPath "$SYSDIR"
  102.   SetOverwrite ifnewer
  103.   File "Program/System/midas.dll"
  104.   ; 注册动态库
  105.   regdll $SYSDIR/midas.dll
  106.   LogSet on
  107. SectionEnd

  108. /******************************
  109. *  创建卸载快捷方式  *
  110. ******************************/
  111. Section -AdditionalIcons
  112.   ; 创建开始菜单卸载快捷方式
  113.   CreateShortCut "$SMPROGRAMS/${PRODUCT_PATH}/${PRODUCT_NAME}/Uninstall.lnk" "$INSTDIR/uninst.exe"
  114. SectionEnd

  115. /******************************
  116. *  写注册表  *
  117. ******************************/
  118. Section -Post
  119.   WriteUninstaller "$INSTDIR/uninst.exe"
  120.   ; 系统启动自动运行软件
  121.   WriteRegStr HKLM "${PRODUCT_REGRUN}" "${PRODUCT_NAME}" "$INSTDIR/${PRODUCT_MAINEXE}"
  122.   WriteRegStr HKLM "${PRODUCT_DIR_REGKEY}" "" "$INSTDIR/${PRODUCT_MAINEXE}"
  123.   WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayName" "$(^Name)"
  124.   WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "UninstallString" "$INSTDIR/uninst.exe"
  125.   WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayIcon" "$INSTDIR/${PRODUCT_MAINEXE}"
  126.   WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayVersion" "${PRODUCT_VERSION}"
  127.   WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "URLInfoAbout" "${PRODUCT_WEB_SITE}"
  128.   WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "Publisher" "${PRODUCT_PUBLISHER}"
  129. SectionEnd

  130. /******************************
  131. *  以下是安装程序的初始和结束部分  *
  132. ******************************/

  133. ; 页面加载之前进行初始化
  134. Function .onInit
  135.   ReadRegStr $UninstallFileName ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "UninstallString"
  136. FunctionEnd

  137. ; 启动背景
  138. Function .onGUIBegin
  139.   BgImage::SetBg /NOUNLOAD /FILLSCREEN ${PRODUCT_TEXT_BACK}
  140.   CreateFont $R0 "Comic Sans MS" 30 400
  141.   BgImage::AddText /NOUNLOAD "${PRODUCT_NAME}" $R0 0 0 255 48 18 798 198

  142.   CreateFont $R3 "Comic Sans MS" 10 100
  143.   BgImage::AddText /NOUNLOAD ${PRODUCT_TEXT_AREA} $R3 0 0 255 88 78 798 198
  144.   CreateFont $R4 "Comic Sans MS" 10 100
  145.   BgImage::AddText /NOUNLOAD ${PRODUCT_TEXT_INTRUDUCE} $R4 0 0 255 88 98 798 198

  146.   CreateFont $R1 "Comic Sans MS" 20 200
  147.   BgImage::AddText /NOUNLOAD ${PRODUCT_TEXT_PROXCY} $R1 0 0 255 68 118 798 198
  148.   CreateFont $R2 "Comic Sans MS" 20 200
  149.   BgImage::AddText /NOUNLOAD ${PRODUCT_TEXT_TEL} $R2 0 0 255 68 158 798 198

  150.   BgImage::Redraw /NOUNLOAD
  151. FunctionEnd

  152. ; 销毁启动背景
  153. Function .onGUIEnd
  154.   BgImage::Destroy
  155. FunctionEnd

  156. /******************************
  157. *  以下是安装程序的卸载部分  *
  158. ******************************/

  159. ; 根据安装日志卸载文件的调用宏
  160. !macro DelFileByLog LogFile
  161.   ifFileExists `${LogFile}` 0 +4
  162.     Push `${LogFile}`
  163.     Call un.DelFileByLog
  164.     Delete `${LogFile}`
  165. !macroend

  166. Section Uninstall

  167.   ; 调用宏只根据安装日志卸载安装程序自己安装过的文件
  168.   !insertmacro DelFileByLog "$INSTDIR/install.log"

  169.   ; 清除安装程序创建的且在卸载时可能为空的子目录,对于递归添加的文件目录,请由最内层的子目录开始清除(注意,不要带 /r 参数,否则会失去 DelFileByLog 的意义)
  170.   RMDir "$SMPROGRAMS/${PRODUCT_PATH}/${PRODUCT_NAME}"
  171.   RMDir "$SMPROGRAMS/${PRODUCT_PATH}"

  172.   RMDir "$INSTDIR"

  173.   DeleteRegValue HKLM "${PRODUCT_REGRUN}" "${PRODUCT_NAME}"
  174.   DeleteRegKey ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}"
  175.   DeleteRegKey HKLM "${PRODUCT_DIR_REGKEY}"
  176.   SetAutoClose true
  177. SectionEnd

  178. #-- 根据 NSIS 脚本编辑规则,所有 Function 区段必须放置在 Section 区段之后编写,以避免安装程序出现未可预知的问题。--#

  179. ; 以下是卸载程序通过安装日志卸载文件的专用函数,请不要随意修改
  180. Function un.DelFileByLog
  181.   Exch $R0
  182.   Push $R1
  183.   Push $R2
  184.   Push $R3
  185.   FileOpen $R0 $R0 r
  186.   ${Do}
  187.     FileRead $R0 $R1
  188.     ${IfThen} $R1 == `` ${|} ${ExitDo} ${|}
  189.     StrCpy $R1 $R1 -2
  190.     StrCpy $R2 $R1 11
  191.     StrCpy $R3 $R1 20
  192.     ${If} $R2 == "File: wrote"
  193.     ${OrIf} $R2 == "File: skipp"
  194.     ${OrIf} $R3 == "CreateShortCut: out:"
  195.     ${OrIf} $R3 == "created uninstaller:"
  196.       Push $R1
  197.       Push `"`
  198.       Call un.DelFileByLog.StrLoc
  199.       Pop $R2
  200.       ${If} $R2 != ""
  201.         IntOp $R2 $R2 + 1
  202.         StrCpy $R3 $R1 "" $R2
  203.         Push $R3
  204.         Push `"`
  205.         Call un.DelFileByLog.StrLoc
  206.         Pop $R2
  207.         ${If} $R2 != ""
  208.           StrCpy $R3 $R3 $R2
  209.           Delete /REBOOTOK $R3
  210.         ${EndIf}
  211.       ${EndIf}
  212.     ${EndIf}
  213.     StrCpy $R2 $R1 7
  214.     ${If} $R2 == "Rename:"
  215.       Push $R1
  216.       Push "->"
  217.       Call un.DelFileByLog.StrLoc
  218.       Pop $R2
  219.       ${If} $R2 != ""
  220.         IntOp $R2 $R2 + 2
  221.         StrCpy $R3 $R1 "" $R2
  222.         Delete /REBOOTOK $R3
  223.       ${EndIf}
  224.     ${EndIf}
  225.   ${Loop}
  226.   FileClose $R0
  227.   Pop $R3
  228.   Pop $R2
  229.   Pop $R1
  230.   Pop $R0
  231. FunctionEnd

  232. Function un.DelFileByLog.StrLoc
  233.   Exch $R0
  234.   Exch
  235.   Exch $R1
  236.   Push $R2
  237.   Push $R3
  238.   Push $R4
  239.   Push $R5
  240.   StrLen $R2 $R0
  241.   StrLen $R3 $R1
  242.   StrCpy $R4 0
  243.   ${Do}
  244.     StrCpy $R5 $R1 $R2 $R4
  245.     ${If} $R5 == $R0
  246.     ${OrIf} $R4 = $R3
  247.       ${ExitDo}
  248.     ${EndIf}
  249.     IntOp $R4 $R4 + 1
  250.   ${Loop}
  251.   ${If} $R4 = $R3
  252.     StrCpy $R0 ""
  253.   ${Else}
  254.     StrCpy $R0 $R4
  255.   ${EndIf}
  256.   Pop $R5
  257.   Pop $R4
  258.   Pop $R3
  259.   Pop $R2
  260.   Pop $R1
  261.   Exch $R0
  262. FunctionEnd

  263. /******************************
  264. *  以下是安装程序的修复部分  *
  265. ******************************/

  266. Function nsDialogsRepairLeave
  267.   ${NSD_GetState} $RADIO_REPAIR $Checkbox_State_REPAIR
  268.   ${NSD_GetState} $RADIO_REMOVE $Checkbox_State_REMOVE
  269.   ${If} $Checkbox_State_REMOVE == ${BST_CHECKED}
  270.     Exec $UninstallFileName
  271.     Quit
  272.   ${EndIf}
  273. FunctionEnd

  274. Function nsDialogsRepair
  275.   ${if} $UninstallFileName == ""
  276.     Abort
  277.   ${EndIf}
  278.   !insertmacro MUI_HEADER_TEXT "已经安装" "选择您要执行的操作"

  279. nsDialogs::Create /NOUNLOAD 1018

  280.   ${NSD_CreateLabel} 10u 0u 300u 30u "软件已经安装,请选择您要执行的操作,并点击『下一步(N)』继续"

  281. ${NSD_CreateRadioButton}  40u 30u 100u 30u "修复或重新安装"
  282. Pop $RADIO_REPAIR
  283. ${If} $Checkbox_State_REPAIR == ${BST_CHECKED}
  284.   ${NSD_Check} $RADIO_REPAIR
  285.   ${NSD_GetState} $RADIO_REPAIR $Checkbox_State
  286. ${EndIf}

  287.   ${NSD_CreateRadioButton}  40u 60u 100u 30u "卸载"
  288.   Pop $RADIO_REMOVE
  289. ${If} $Checkbox_State_REMOVE == ${BST_CHECKED}
  290.   ${NSD_Check} $RADIO_REMOVE
  291.   ${NSD_GetState} $RADIO_REMOVE $Checkbox_State
  292. ${EndIf}

  293.   ${If} $Checkbox_State <> ${BST_CHECKED}
  294.     ${NSD_Check} $RADIO_REPAIR
  295.   ${EndIf}
  296. nsDialogs::Show
  297. FunctionEnd
复制代码


相关帖子

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-18 02:33 , Processed in 0.113323 second(s), 22 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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