commonfunc.nsh 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. #此处判断最后一段,如果已经是与我要追加的目录名一样,就不再追加了,如果不一样,则还需要追加 同时记录好写入注册表的路径
  2. Function AdjustInstallPath
  3. nsNiuniuSkin::StringHelper "$0" "\" "" "trimright"
  4. pop $0
  5. nsNiuniuSkin::StringHelper "$0" "\" "" "getrightbychar"
  6. pop $1
  7. ${If} "$1" == "${INSTALL_APPEND_PATH}"
  8. StrCpy $INSTDIR "$0"
  9. ${Else}
  10. StrCpy $INSTDIR "$0\${INSTALL_APPEND_PATH}"
  11. ${EndIf}
  12. FunctionEnd
  13. #判断选定的安装路径是否合法,主要检测硬盘是否存在[只能是HDD],路径是否包含非法字符 结果保存在$R5中
  14. Function IsSetupPathIlleagal
  15. ${GetRoot} "$INSTDIR" $R3 ;获取安装根目录
  16. StrCpy $R0 "$R3\"
  17. StrCpy $R1 "invalid"
  18. ${GetDrives} "HDD" "HDDDetection" ;获取将要安装的根目录磁盘类型
  19. ${If} $R1 == "HDD" ;是硬盘
  20. StrCpy $R5 "1"
  21. ${DriveSpace} "$R3\" "/D=F /S=M" $R0 #获取指定盘符的剩余可用空间,/D=F剩余空间, /S=M单位兆字节
  22. ${If} $R0 < 100 #400即程序安装后需要占用的实际空间,单位:MB
  23. StrCpy $R5 "-1" #表示空间不足
  24. ${endif}
  25. ${Else}
  26. #0表示不合法
  27. StrCpy $R5 "0"
  28. ${endif}
  29. FunctionEnd
  30. Function HDDDetection
  31. ${If} "$R0" == "$9"
  32. StrCpy $R1 "HDD"
  33. ${Endif}
  34. Push $0
  35. FunctionEnd
  36. #获取默认的安装路径
  37. Function GenerateSetupAddress
  38. #读取注册表安装路径
  39. SetRegView 32
  40. ReadRegStr $0 HKLM "Software\${PRODUCT_PATHNAME}" "InstPath"
  41. ${If} "$0" != "" #路径不存在,则重新选择路径
  42. #路径读取到了,直接使用
  43. #再判断一下这个路径是否有效
  44. nsNiuniuSkin::StringHelper "$0" "\\" "\" "replace"
  45. Pop $0
  46. StrCpy $INSTDIR "$0"
  47. ${EndIf}
  48. #如果从注册表读的地址非法,则还需要写上默认地址
  49. Call IsSetupPathIlleagal
  50. ${If} $R5 == "0"
  51. StrCpy $INSTDIR "$PROGRAMFILES32\${INSTALL_APPEND_PATH}"
  52. ${EndIf}
  53. ${GetRoot} "D:\" $R3 ;获取安装根目录
  54. StrCpy $R0 "$R3\"
  55. StrCpy $R1 "invalid"
  56. ${GetDrives} "HDD" "HDDDetection" ;获取将要安装的根目录磁盘类型
  57. ${If} $R1 == "HDD" ;是硬盘
  58. StrCpy $R5 "1"
  59. ${DriveSpace} "$R3\" "/D=F /S=M" $R0 #获取指定盘符的剩余可用空间,/D=F剩余空间, /S=M单位兆字节
  60. StrCpy $INSTDIR "D:\${INSTALL_APPEND_PATH}"
  61. ${Else}
  62. ${endif}
  63. FunctionEnd
  64. # 生成卸载入口
  65. Function CreateUninstall
  66. #写入注册信息
  67. SetRegView 32
  68. WriteRegStr HKLM "Software\${PRODUCT_PATHNAME}" "InstPath" "$INSTDIR"
  69. # WriteUninstaller "$INSTDIR\uninst.exe"
  70. # 添加卸载信息到控制面板
  71. WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_PATHNAME}" "DisplayName" "${PRODUCT_NAME}"
  72. WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_PATHNAME}" "UninstallString" "$INSTDIR\uninst.exe"
  73. WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_PATHNAME}" "DisplayIcon" "$INSTDIR\${EXE_NAME}"
  74. WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_PATHNAME}" "Publisher" "${PRODUCT_PUBLISHER}"
  75. WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_PATHNAME}" "DisplayVersion" "${PRODUCT_VERSION}"
  76. FunctionEnd
  77. # ========================= 安装步骤 ===============================
  78. ;创建桌面快捷方式
  79. Function CreateDeskTopIco
  80. #添加到桌面快捷方式的动作在此添加
  81. SetShellVarContext all
  82. CreateShortCut "$DESKTOP\${PRODUCT_NAME}.lnk" "$INSTDIR\${EXE_NAME}"
  83. SetShellVarContext current
  84. FunctionEnd
  85. ;创建任务栏快捷方式
  86. Function CreateBarlnk
  87. ReadRegStr $R0 HKLM "SOFTWARE\Microsoft\Windows NT\CurrentVersion" "CurrentVersion"
  88. ${if} $R0 >= 6.0
  89. SetOutPath $INSTDIR
  90. ;创建任务栏快捷方式(win10系统会失败,并且导致程序运行)
  91. ;ExecShell taskbarpin "$DESKTOP\${PRODUCT_NAME}.lnk"
  92. ${StdUtils.InvokeShellVerb} $0 "$INSTDIR" "${EXE_NAME}" ${StdUtils.Const.ShellVerb.PinToTaskbar}
  93. ${else}
  94. CreateShortCut "$QUICKLAUNCH\${PRODUCT_NAME}.lnk" "$INSTDIR\${EXE_NAME}"
  95. ${Endif}
  96. FunctionEnd
  97. # 锁定任务栏
  98. Function createTaskBar
  99. ReadRegStr $0 HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment" "PROCESSOR_ARCHITECTURE"
  100. ${if} $0 == 'x86'
  101. SetOutPath "$TEMP"
  102. #File "PinToTaskbar\x86\PinToTaskbar.exe"
  103. #File "PinToTaskbar\x86\PinToTaskbarHelper.dll"
  104. #ExecWait '"$TEMP\PinToTaskbar.exe" /pin "$INSTDIR\${EXE_NAME}"'
  105. #Delete "$TEMP\PinToTaskbar.exe"
  106. #Delete "$TEMP\PinToTaskbarHelper.dll"
  107. ${else}
  108. SetOutPath "$TEMP"
  109. #File "PinToTaskbar\x64\PinToTaskbar.exe"
  110. #File "PinToTaskbar\x64\PinToTaskbarHelper.dll"
  111. #ExecWait '"$TEMP\PinToTaskbar.exe" /pin "$INSTDIR\${EXE_NAME}"'
  112. #Delete "$TEMP\PinToTaskbar.exe"
  113. #Delete "$TEMP\PinToTaskbarHelper.dll"
  114. ${Endif}
  115. FunctionEnd
  116. ; 创建开机启动
  117. Function CreateBootStart
  118. CreateShortCut "$SMSTARTUP\${PRODUCT_NAME}.lnk" "$INSTDIR\${EXE_NAME}"
  119. FunctionEnd
  120. ;刷新关联图标
  121. Function RefreshShellIcons
  122. System::Call 'shell32.dll::SHChangeNotify(i, i, i, i) v \
  123. (${SHCNE_ASSOCCHANGED}, ${SHCNF_IDLIST}, 0, 0)'
  124. FunctionEnd
  125. Function ExtractFunc
  126. #安装文件的7Z压缩包
  127. SetOutPath $INSTDIR
  128. #根据宏来区分是否走非NSIS7Z的进度条
  129. !ifdef INSTALL_WITH_NO_NSIS7Z
  130. !include "..\app.nsh"
  131. !else
  132. GetFunctionAddress $R9 ExtractCallback
  133. nsis7zU::ExtractWithCallback "$INSTDIR\${INSTALL_7Z_NAME}" $R9
  134. Delete "$INSTDIR\${INSTALL_7Z_NAME}"
  135. !endif
  136. Sleep 300
  137. FunctionEnd
  138. Function un.DeleteShotcutAndInstallInfo
  139. SetRegView 32
  140. DeleteRegKey HKLM "Software\${PRODUCT_PATHNAME}"
  141. DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_PATHNAME}"
  142. ; 删除快捷方式
  143. SetShellVarContext all
  144. Delete "$SMPROGRAMS\${PRODUCT_NAME}\${PRODUCT_NAME}.lnk"
  145. Delete "$SMPROGRAMS\${PRODUCT_NAME}\卸载${PRODUCT_NAME}.lnk"
  146. RMDir "$SMPROGRAMS\${PRODUCT_NAME}\"
  147. Delete "$DESKTOP\${PRODUCT_NAME}.lnk"
  148. #删除开机启动
  149. Delete "$SMSTARTUP\${PRODUCT_NAME}.lnk"
  150. SetShellVarContext all
  151. FunctionEnd