commonfunc.nsh 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. Function AdjustInstallPath
  2. #此处判断最后一段,如果已经是与我要追加的目录名一样,就不再追加了,如果不一样,则还需要追加 同时记录好写入注册表的路径
  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. StrCpy $0 ""
  19. ${GetDrives} "HDD" "HDDDetection" ;获取将要安装的根目录磁盘类型
  20. ${If} $R1 == "HDD" ;是硬盘
  21. StrCpy $R5 "1"
  22. ${DriveSpace} "$R3\" "/D=F /S=M" $R0 #获取指定盘符的剩余可用空间,/D=F剩余空间, /S=M单位兆字节
  23. ${If} $R0 < 100 #400即程序安装后需要占用的实际空间,单位:MB
  24. StrCpy $R5 "-1" #表示空间不足
  25. ${endif}
  26. ${Else}
  27. #0表示不合法
  28. StrCpy $R5 "0"
  29. ${endif}
  30. FunctionEnd
  31. Function HDDDetection
  32. ${If} "$R0" == "$9"
  33. StrCpy $R1 "HDD"
  34. StrCpy $0 "StopGetDrives"
  35. ${Endif}
  36. Push $0
  37. FunctionEnd
  38. #获取默认的安装路径
  39. Function GenerateSetupAddress
  40. ${If} ${INSTALL_DEFALT_SETUPPATH} == "" #默认路径不存在,则重新选择路径
  41. #读取注册表安装路径
  42. SetRegView 64
  43. ReadRegStr $0 HKLM "Software\${PRODUCT_PATHNAME}" "InstPath"
  44. ${If} "$0" != "" #路径不存在,则重新选择路径
  45. #路径读取到了,直接使用
  46. #再判断一下这个路径是否有效
  47. nsNiuniuSkin::StringHelper "$0" "\\" "\" "replace"
  48. Pop $0
  49. StrCpy $INSTDIR "$0"
  50. ${EndIf}
  51. Call IsSetupPathIlleagal
  52. ${If} $R5 == "0"
  53. StrCpy $INSTDIR "$PROGRAMFILES32\${INSTALL_APPEND_PATH}"
  54. ${EndIf}
  55. ${EndIf}
  56. #如果从注册表读的地址非法,则还需要写上默认地址
  57. FunctionEnd
  58. #====================获取默认安装的要根目录 结果存到$R5中
  59. Function GetDefaultSetupRootPath
  60. #先默认到D盘
  61. ${GetRoot} "D:\" $R3 ;获取安装根目录
  62. StrCpy $R0 "$R3\"
  63. StrCpy $R1 "invalid"
  64. ${GetDrives} "HDD" "HDDDetection" ;获取将要安装的根目录磁盘类型
  65. ${If} $R1 == "HDD" ;是硬盘
  66. #检查空间是否够用
  67. StrCpy $R5 "D:\" 2 0
  68. ${DriveSpace} "$R3\" "/D=F /S=M" $R0 #获取指定盘符的剩余可用空间,/D=F剩余空间, /S=M单位兆字节
  69. ${If} $R0 < 300 #400即程序安装后需要占用的实际空间,单位:MB
  70. StrCpy $R5 "C:"
  71. ${endif}
  72. ${Else}
  73. #此处需要设置C盘为默认路径了
  74. StrCpy $R5 "C:"
  75. ${endif}
  76. FunctionEnd
  77. # 生成卸载入口
  78. Function CreateUninstall
  79. #写入注册信息
  80. SetRegView 64
  81. WriteRegStr HKLM "Software\${PRODUCT_PATHNAME}" "InstPath" "$INSTDIR"
  82. WriteUninstaller "$INSTDIR\uninst.exe"
  83. # 添加卸载信息到控制面板
  84. WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_PATHNAME}" "DisplayName" "${PRODUCT_NAME}"
  85. WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_PATHNAME}" "UninstallString" "$INSTDIR\uninst.exe"
  86. WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_PATHNAME}" "DisplayIcon" "$INSTDIR\${EXE_NAME}"
  87. WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_PATHNAME}" "Publisher" "${PRODUCT_PUBLISHER}"
  88. WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_PATHNAME}" "DisplayVersion" "${PRODUCT_VERSION}"
  89. FunctionEnd
  90. # ========================= 安装步骤 ===============================
  91. Function CreateAppShortcut
  92. SetShellVarContext all
  93. CreateDirectory "$SMPROGRAMS\${PRODUCT_NAME}"
  94. CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\${PRODUCT_NAME}.lnk" "$INSTDIR\${EXE_NAME}"
  95. CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\卸载${PRODUCT_NAME}.lnk" "$INSTDIR\uninst.exe"
  96. SetShellVarContext current
  97. FunctionEnd
  98. Function ExtractFunc
  99. #安装文件的7Z压缩包
  100. SetOutPath $INSTDIR
  101. #根据宏来区分是否走非NSIS7Z的进度条
  102. !ifdef INSTALL_WITH_NO_NSIS7Z
  103. !include "..\app.nsh"
  104. !else
  105. File "${INSTALL_7Z_PATH}"
  106. GetFunctionAddress $R9 ExtractCallback
  107. nsis7zU::ExtractWithCallback "$INSTDIR\${INSTALL_7Z_NAME}" $R9
  108. Delete "$INSTDIR\${INSTALL_7Z_NAME}"
  109. !endif
  110. Sleep 100
  111. FunctionEnd
  112. Function un.DeleteShotcutAndInstallInfo
  113. SetRegView 64
  114. DeleteRegKey HKLM "Software\${PRODUCT_PATHNAME}"
  115. DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_PATHNAME}"
  116. ; 删除快捷方式
  117. SetShellVarContext all
  118. Delete "$SMPROGRAMS\${PRODUCT_NAME}\${PRODUCT_NAME}.lnk"
  119. Delete "$SMPROGRAMS\${PRODUCT_NAME}\卸载${PRODUCT_NAME}.lnk"
  120. RMDir "$SMPROGRAMS\${PRODUCT_NAME}\"
  121. Delete "$DESKTOP\${PRODUCT_NAME}.lnk"
  122. #删除开机启动
  123. Delete "$SMSTARTUP\${PRODUCT_NAME}.lnk"
  124. SetShellVarContext current
  125. FunctionEnd