test.nsh 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659
  1. 
  2. # ===================== 外部插件以及宏 =============================
  3. !include "StrFunc.nsh"
  4. !include "WordFunc.nsh"
  5. !include "LogicLib.nsh"
  6. !include "nsDialogs.nsh"
  7. !include "x64.nsh"
  8. !include "MUI2.nsh"
  9. !include "WinVer.nsh"
  10. !include "FileFunc.nsh"
  11. !include "stdutils.nsh"
  12. !include "commonfunc.nsh"
  13. ;Languages
  14. !insertmacro MUI_LANGUAGE "SimpChinese"
  15. # ===================== 安装包版本 =============================
  16. VIProductVersion "${PRODUCT_VERSION}"
  17. VIAddVersionKey "ProductVersion" "${PRODUCT_VERSION}"
  18. VIAddVersionKey "ProductName" "${PRODUCT_NAME}"
  19. VIAddVersionKey "CompanyName" "${PRODUCT_PUBLISHER}"
  20. VIAddVersionKey "FileVersion" "${PRODUCT_VERSION}"
  21. VIAddVersionKey "InternalName" "${EXE_NAME}"
  22. VIAddVersionKey "FileDescription" "${PRODUCT_NAME}"
  23. VIAddVersionKey "LegalCopyright" "${PRODUCT_LEGAL}"
  24. !define INSTALL_PAGE_CONFIG 0
  25. !define INSTALL_PAGE_PROCESSING 1
  26. !define INSTALL_PAGE_FINISH 2
  27. !define INSTALL_PAGE_UNISTCONFIG 3
  28. !define INSTALL_PAGE_UNISTPROCESSING 4
  29. !define INSTALL_PAGE_UNISTFINISH 5
  30. Function .onInit
  31. ;创建互斥防止重复运行
  32. System::Call 'kernel32::CreateMutexA(i 0, i 0, t "ACEUIInstall") i .r1 ?e'
  33. Pop $R0
  34. StrCmp $R0 0 +3
  35. MessageBox MB_OK "有一个 ${PRODUCT_NAME} 安装向导已经运行!"
  36. Abort
  37. Call sendStatistics
  38. FunctionEnd
  39. # 自定义页面
  40. Page custom DUIPage
  41. # 卸载程序显示进度
  42. UninstPage custom un.DUIPage
  43. # ======================= DUILIB 自定义页面 =========================
  44. Var hInstallDlg
  45. Var hInstallSubDlg
  46. Var sSetupPath
  47. Var sReserveData #卸载时是否保留数据
  48. Var InstallState #是在安装中还是安装完成
  49. Var UnInstallValue #卸载的进度
  50. Var isPreference
  51. Function DUIPage
  52. StrCpy $InstallState "0" #设置未安装完成状态
  53. InitPluginsDir
  54. SetOutPath "$PLUGINSDIR"
  55. File "${INSTALL_LICENCE_FILENAME}"
  56. File "${INSTALL_RES_PATH}"
  57. File /oname=logo.ico "${INSTALL_ICO}" #此处的目标文件一定是logo.ico,否则控件将找不到文件
  58. nsNiuniuSkin::InitSkinPage "$PLUGINSDIR\" "${INSTALL_LICENCE_FILENAME}" #指定插件路径及协议文件名称
  59. Pop $hInstallDlg
  60. #生成安装路径,包含识别旧的安装路径
  61. Call GenerateSetupAddress
  62. #设置控件显示安装路径
  63. nsNiuniuSkin::SetControlAttribute $hInstallDlg "editDir" "text" "$INSTDIR\"
  64. #设置安装包的标题及任务栏显示
  65. nsNiuniuSkin::SetWindowTile $hInstallDlg "${PRODUCT_NAME}安装程序"
  66. nsNiuniuSkin::ShowPageItem $hInstallDlg "wizardTab" ${INSTALL_PAGE_CONFIG}
  67. Call BindUIControls
  68. nsNiuniuSkin::ShowPage 0
  69. FunctionEnd
  70. #绑定安装的界面事件
  71. Function BindUIControls
  72. # License页面
  73. GetFunctionAddress $0 OnBtnShowConfig
  74. nsNiuniuSkin::BindCallBack $hInstallDlg "btnAgree" $0
  75. GetFunctionAddress $0 OnBtnLicenseClick
  76. nsNiuniuSkin::BindCallBack $hInstallDlg "btnAgreement" $0
  77. # 目录选择 页面
  78. GetFunctionAddress $0 OnExitDUISetup
  79. nsNiuniuSkin::BindCallBack $hInstallDlg "btnDirClose" $0
  80. GetFunctionAddress $0 OnExitDUISetup
  81. nsNiuniuSkin::BindCallBack $hInstallDlg "btnLicenseCancel" $0
  82. GetFunctionAddress $0 OnBtnMin
  83. nsNiuniuSkin::BindCallBack $hInstallDlg "btnDirMin" $0
  84. GetFunctionAddress $0 OnBtnSelectDir
  85. nsNiuniuSkin::BindCallBack $hInstallDlg "btnSelectDir" $0
  86. GetFunctionAddress $0 OnBtnDirPre
  87. nsNiuniuSkin::BindCallBack $hInstallDlg "btnDirPre" $0
  88. GetFunctionAddress $0 OnBtnCancel
  89. nsNiuniuSkin::BindCallBack $hInstallDlg "btnDirCancel" $0
  90. GetFunctionAddress $0 OnBtnInstall
  91. nsNiuniuSkin::BindCallBack $hInstallDlg "btnInstall" $0
  92. # 安装进度 页面
  93. GetFunctionAddress $0 OnExitDUISetup
  94. nsNiuniuSkin::BindCallBack $hInstallDlg "btnDetailClose" $0
  95. GetFunctionAddress $0 OnBtnMin
  96. nsNiuniuSkin::BindCallBack $hInstallDlg "btnDetailMin" $0
  97. # 安装完成 页面
  98. GetFunctionAddress $0 OnFinished
  99. nsNiuniuSkin::BindCallBack $hInstallDlg "btnRun" $0
  100. GetFunctionAddress $0 OnBtnMin
  101. nsNiuniuSkin::BindCallBack $hInstallDlg "btnFinishedMin" $0
  102. GetFunctionAddress $0 OnExitDUISetup
  103. nsNiuniuSkin::BindCallBack $hInstallDlg "btnClose" $0
  104. GetFunctionAddress $0 OnCheckLicenseClick
  105. nsNiuniuSkin::BindCallBack $hInstallDlg "chkAgree" $0
  106. GetFunctionAddress $0 OnBtnShowMore
  107. nsNiuniuSkin::BindCallBack $hInstallDlg "btnShowMore" $0
  108. GetFunctionAddress $0 OnBtnHideMore
  109. nsNiuniuSkin::BindCallBack $hInstallDlg "btnHideMore" $0
  110. #绑定窗口通过alt+f4等方式关闭时的通知事件
  111. GetFunctionAddress $0 OnSysCommandCloseEvent
  112. nsNiuniuSkin::BindCallBack $hInstallDlg "syscommandclose" $0
  113. #绑定路径变化的通知事件
  114. GetFunctionAddress $0 OnRichEditTextChange
  115. nsNiuniuSkin::BindCallBack $hInstallDlg "editDir" $0
  116. nsNiuniuSkin::SetControlAttribute $hInstallDlg "chkShotcut" "text" "生成快捷方式"
  117. FunctionEnd
  118. # 开始安装
  119. Function OnBtnInstall
  120. #此处检测当前是否同意用户协议
  121. nsNiuniuSkin::GetControlAttribute $hInstallDlg "chkAgree" "selected"
  122. Pop $0
  123. ${If} $0 == "0" #如果未同意,提示
  124. StrCpy $R8 "请先同意用户许可协议!"
  125. StrCpy $R7 "0"
  126. Call ShowMsgBox
  127. goto InstallAbort
  128. ${EndIf}
  129. #此处检测当前是否有程序正在运行,如果正在运行,提示先卸载再安装
  130. nsProcess::_FindProcess "${EXE_NAME}"
  131. Pop $R0
  132. ${If} $R0 == 0
  133. StrCpy $R8 "${PRODUCT_NAME} 正在运行,请退出后重试!"
  134. StrCpy $R7 "0"
  135. Call ShowMsgBox
  136. nsProcess::_KillProcess "${EXE_NAME}"
  137. goto InstallAbort
  138. ${EndIf}
  139. nsNiuniuSkin::GetControlAttribute $hInstallDlg "editDir" "text"
  140. Pop $0
  141. StrCmp $0 "" InstallAbort 0
  142. #校正路径(追加)
  143. Call AdjustInstallPath
  144. StrCpy $sSetupPath "$INSTDIR"
  145. Call IsSetupPathIlleagal
  146. ${If} $R5 == "0"
  147. StrCpy $R8 "路径非法,请使用正确的路径安装!"
  148. StrCpy $R7 "0"
  149. Call ShowMsgBox
  150. goto InstallAbort
  151. ${EndIf}
  152. ${If} $R5 == "-1"
  153. StrCpy $R8 "目标磁盘空间不足,请使用其他的磁盘安装!"
  154. StrCpy $R7 "0"
  155. Call ShowMsgBox
  156. goto InstallAbort
  157. ${EndIf}
  158. nsNiuniuSkin::SetWindowSize $hInstallDlg 570 410
  159. nsNiuniuSkin::SetControlAttribute $hInstallDlg "btnClose" "enabled" "false"
  160. nsNiuniuSkin::ShowPageItem $hInstallDlg "wizardTab" ${INSTALL_PAGE_PROCESSING}
  161. nsNiuniuSkin::SetControlAttribute $hInstallDlg "slrProgress" "min" "0"
  162. nsNiuniuSkin::SetControlAttribute $hInstallDlg "slrProgress" "max" "100"
  163. # 下载文件
  164. Call DownloadApp
  165. #启动一个低优先级的后台线程
  166. Sleep 200
  167. nsNiuniuSkin::SetControlAttribute $hInstallDlg "processname" "text" "安装中 ..."
  168. GetFunctionAddress $0 ExtractFunc
  169. BgWorker::CallAndWait
  170. #安装统计
  171. Call sendStatistics
  172. #创建快捷方式 添加到快速启动栏的标志 开机启动
  173. Call CreateShortcut
  174. Call CreateUninstall
  175. nsNiuniuSkin::SetControlAttribute $hInstallDlg "btnClose" "enabled" "true"
  176. StrCpy $InstallState "1"
  177. #如果不想完成立即启动的话,需要屏蔽下面的OnFinished的调用,并且打开显示INSTALL_PAGE_FINISH
  178. Call OnFinished
  179. #以下这行如果打开,则是跳转到完成页面
  180. #nsNiuniuSkin::ShowPageItem $hInstallDlg "wizardTab" ${INSTALL_PAGE_FINISH}
  181. InstallAbort:
  182. FunctionEnd
  183. #############################################################
  184. # 下载安装包
  185. Function DownloadApp
  186. nsNiuniuSkin::SetControlAttribute $hInstallDlg "processname" "text" "解压中 ..."
  187. NSxfer::Request /URL "${APP_DOWNLOAD_URL}" /LOCAL "$INSTDIR\${INSTALL_7Z_NAME}" /TIMEOUTCONNECT 6000 /TIMEOUTRECONNECT 6000 /END
  188. Pop $3 ; Request ID1
  189. Call TimerDownloadInfiniteLoop
  190. NSxfer::Wait /ID $3 /MODE SILENT /END
  191. NSxfer::Query /ID $3 /ERRORCODE /PERCENT /SPEED /END
  192. Pop $R0 ; Error code (HTTP status 200-299 for success)
  193. ${If} $R0 < 200
  194. ${OrIf} $R0 > 299
  195. ThreadTimer::Stop
  196. MessageBox MB_OKCANCEL "$R0 解压出错,请确保网络连接正常,然后再试!" IDOK trueValue IDCANCEL falseValue
  197. trueValue:
  198. Call DownloadApp
  199. Goto next
  200. falseValue:
  201. nsNiuniuSkin::ExitDUISetup
  202. next:
  203. ${EndIf}
  204. ThreadTimer::Stop # 下载完成,关闭定时器
  205. FunctionEnd
  206. # 定时器,检测下载,显示进度条
  207. Function TimerDownloadInfiniteLoop
  208. GetFunctionAddress $2 TryMe
  209. ThreadTimer::Start 100 -1 $2 ; Timer ticks every 1234 milliseconds, it calls function TryMe in infinite loop until ThreadTimer::Stop is called
  210. FunctionEnd
  211. Function TryMe
  212. NSxfer::Query /ID $3 /ERRORCODE /PERCENT /SPEED /END
  213. Pop $R0 ; Error code (HTTP status 200-299 for success)
  214. Pop $R1
  215. Pop $R2
  216. ${If} $R0 < '299'
  217. nsNiuniuSkin::SetControlAttribute $hInstallDlg "processname" "text" "解压中 ... $R2"
  218. nsNiuniuSkin::SetControlAttribute $hInstallDlg "slrProgress" "value" "$R1"
  219. ${Else}
  220. nsNiuniuSkin::SetControlAttribute $hInstallDlg "processname" "text" "解压出错,请重试!err: $R0"
  221. ${EndIf}
  222. FunctionEnd
  223. #############################################################
  224. Function CreateShortcut
  225. SetShellVarContext all
  226. #electron 如果app文件夹存在,则删除,为了避免app,app.asar出现冲突的情况
  227. ${If} ${FIleExists} "$INSTDIR\resources\app"
  228. RMDir /r "$INSTDIR\resources\app"
  229. ${EndIf}
  230. CreateDirectory "$SMPROGRAMS\${PRODUCT_NAME}"
  231. CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\${PRODUCT_NAME}.lnk" "$INSTDIR\${EXE_NAME}"
  232. CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\卸载${PRODUCT_NAME}.lnk" "$INSTDIR\uninst.exe"
  233. # 锁定任务栏
  234. Call createTaskBar
  235. #根据复选框的值来决定是否添加桌面快捷方式
  236. nsNiuniuSkin::GetControlAttribute $hInstallDlg "chkShotcut" "selected"
  237. Pop $R0
  238. ${If} $R0 == "1"
  239. Call CreateDeskTopIco
  240. ${EndIf}
  241. #添加到快速启动栏
  242. nsNiuniuSkin::GetControlAttribute $hInstallDlg "chkQuickStart" "selected"
  243. Pop $R0
  244. ${If} $R0 == "1"
  245. Call CreateBarlnk
  246. ${EndIf}
  247. # 开机启动
  248. nsNiuniuSkin::GetControlAttribute $hInstallDlg "chkAutoRun" "selected"
  249. Pop $R0
  250. ${If} $R0 == "1"
  251. Call CreateBootStart
  252. ${EndIf}
  253. #刷新关联图标
  254. Call RefreshShellIcons
  255. FunctionEnd
  256. #安装界面点击退出,给出提示
  257. Function OnExitDUISetup
  258. ${If} $InstallState == "0"
  259. StrCpy $R8 "安装尚未完成,您确定退出安装么?"
  260. StrCpy $R7 "1"
  261. Call ShowMsgBox
  262. pop $0
  263. ${If} $0 == 0
  264. goto endfun
  265. ${EndIf}
  266. ${EndIf}
  267. nsNiuniuSkin::ExitDUISetup
  268. endfun:
  269. FunctionEnd
  270. Function OnBtnMin
  271. SendMessage $hInstallDlg ${WM_SYSCOMMAND} 0xF020 0
  272. FunctionEnd
  273. Function OnBtnCancel
  274. nsNiuniuSkin::ExitDUISetup
  275. FunctionEnd
  276. Function OnFinished
  277. #立即启动
  278. #Exec "$INSTDIR\${EXE_NAME}"
  279. System::Call 'shell32::ShellExecute(i 0, t"open", t"explorer.exe", t" /e,${EXE_NAME}", t"$INSTDIR\\", i 0)'
  280. Call OnExitDUISetup
  281. FunctionEnd
  282. Function OnBtnDirPre
  283. FunctionEnd
  284. Function OnBtnSelectDir
  285. nsNiuniuSkin::SelectInstallDirEx $hInstallDlg "请选择安装路径"
  286. Pop $0
  287. ${Unless} "$0" == ""
  288. nsNiuniuSkin::SetControlAttribute $hInstallDlg "editDir" "text" $0
  289. ${EndUnless}
  290. FunctionEnd
  291. Function StepHeightSizeAsc
  292. ${ForEach} $R0 410 500 + 10
  293. nsNiuniuSkin::SetWindowSize $hInstallDlg 570 $R0
  294. Sleep 20
  295. ${Next}
  296. FunctionEnd
  297. Function StepHeightSizeDsc
  298. ${ForEach} $R0 500 410 - 10
  299. nsNiuniuSkin::SetWindowSize $hInstallDlg 570 $R0
  300. Sleep 20
  301. ${Next}
  302. FunctionEnd
  303. Function OnBtnShowMore
  304. nsNiuniuSkin::SetControlAttribute $hInstallDlg "moreconfiginfo" "visible" "true"
  305. nsNiuniuSkin::SetControlAttribute $hInstallDlg "btnShowMore" "visible" "false"
  306. nsNiuniuSkin::SetControlAttribute $hInstallDlg "btnHideMore" "visible" "true"
  307. ;调整窗口高度
  308. GetFunctionAddress $0 StepHeightSizeAsc
  309. BgWorker::CallAndWait
  310. nsNiuniuSkin::SetWindowSize $hInstallDlg 570 500
  311. FunctionEnd
  312. Function OnBtnHideMore
  313. nsNiuniuSkin::SetControlAttribute $hInstallDlg "moreconfiginfo" "visible" "false"
  314. nsNiuniuSkin::SetControlAttribute $hInstallDlg "btnShowMore" "visible" "true"
  315. nsNiuniuSkin::SetControlAttribute $hInstallDlg "btnHideMore" "visible" "false"
  316. ;调整窗口高度
  317. GetFunctionAddress $0 StepHeightSizeDsc
  318. BgWorker::CallAndWait
  319. nsNiuniuSkin::SetWindowSize $hInstallDlg 570 410
  320. FunctionEnd
  321. Function OnBtnShowConfig
  322. nsNiuniuSkin::SetControlAttribute $hInstallDlg "licenseshow" "visible" "false"
  323. FunctionEnd
  324. #根据选中的情况来控制按钮是否灰度显示
  325. Function OnCheckLicenseClick
  326. nsNiuniuSkin::GetControlAttribute $hInstallDlg "chkAgree" "selected"
  327. Pop $0
  328. ${If} $0 == "0"
  329. nsNiuniuSkin::SetControlAttribute $hInstallDlg "btnInstall" "enabled" "true"
  330. #${Else}
  331. # nsNiuniuSkin::SetControlAttribute $hInstallDlg "btnInstall" "enabled" "false"
  332. ${EndIf}
  333. FunctionEnd
  334. Function OnBtnLicenseClick
  335. ;nsNiuniuSkin::ShowPageItem "wizardTab" ${INSTALL_PAGE_LICENSE}
  336. nsNiuniuSkin::SetControlAttribute $hInstallDlg "licenseshow" "visible" "true"
  337. nsNiuniuSkin::GetControlAttribute $hInstallDlg "moreconfiginfo" "visible"
  338. Pop $0
  339. ${If} $0 = 0
  340. ;pos="10,35,560,405"
  341. nsNiuniuSkin::SetControlAttribute $hInstallDlg "licenseshow" "pos" "10,35,560,405"
  342. nsNiuniuSkin::SetControlAttribute $hInstallDlg "editLicense" "height" "295"
  343. ${Else}
  344. nsNiuniuSkin::SetControlAttribute $hInstallDlg "licenseshow" "pos" "10,35,560,495"
  345. nsNiuniuSkin::SetControlAttribute $hInstallDlg "editLicense" "height" "385"
  346. ${EndIf}
  347. FunctionEnd
  348. #此处是路径变化时的事件通知
  349. Function OnRichEditTextChange
  350. #可在此获取路径,判断是否合法等处理
  351. FunctionEnd
  352. #CTRL+F4关闭时的事件通知
  353. Function OnSysCommandCloseEvent
  354. Call OnExitDUISetup
  355. FunctionEnd
  356. Function ExtractCallback
  357. Pop $1
  358. Pop $2
  359. System::Int64Op $1 * 100
  360. Pop $3
  361. System::Int64Op $3 / $2
  362. Pop $0
  363. nsNiuniuSkin::SetControlAttribute $hInstallDlg "slrProgress" "value" "$0"
  364. ${If} $1 == $2
  365. nsNiuniuSkin::SetControlAttribute $hInstallDlg "slrProgress" "value" "100"
  366. ${EndIf}
  367. FunctionEnd
  368. Function ShowMsgBox
  369. nsNiuniuSkin::InitSkinSubPage "msgBox.xml" "btnOK" "btnCancel,btnClose" ; "提示" "${PRODUCT_NAME} 正在运行,请退出后重试!" 0
  370. Pop $hInstallSubDlg
  371. nsNiuniuSkin::SetControlAttribute $hInstallSubDlg "lblTitle" "text" "提示"
  372. nsNiuniuSkin::SetControlAttribute $hInstallSubDlg "lblMsg" "text" "$R8"
  373. ${If} "$R7" == "1"
  374. nsNiuniuSkin::SetControlAttribute $hInstallSubDlg "hlCancel" "visible" "true"
  375. ${EndIf}
  376. nsNiuniuSkin::ShowSkinSubPage 0
  377. FunctionEnd
  378. ########################################################
  379. Function un.onInit
  380. ;创建互斥防止重复运行
  381. System::Call 'kernel32::CreateMutexA(i 0, i 0, t "aceuiUnInstall") i .r1 ?e'
  382. Pop $R0
  383. StrCmp $R0 0 +3
  384. MessageBox MB_OK "有一个 ${PRODUCT_NAME} 卸载向导已经运行!"
  385. Abort
  386. FunctionEnd
  387. Function un.DUIPage
  388. StrCpy $InstallState "0"
  389. InitPluginsDir
  390. SetOutPath "$PLUGINSDIR"
  391. File "${INSTALL_RES_PATH}"
  392. nsNiuniuSkin::InitSkinPage "$PLUGINSDIR\" ""
  393. Pop $hInstallDlg
  394. nsNiuniuSkin::ShowPageItem $hInstallDlg "wizardTab" ${INSTALL_PAGE_UNISTCONFIG}
  395. #设置安装包的标题及任务栏显示
  396. nsNiuniuSkin::SetWindowTile $hInstallDlg "${PRODUCT_NAME}卸载程序"
  397. nsNiuniuSkin::SetWindowSize $hInstallDlg 570 400
  398. Call un.BindUnInstUIControls
  399. #此处检测当前是否有程序正在运行,如果正在运行,提示先卸载再安装
  400. nsProcess::_FindProcess "${EXE_NAME}"
  401. Pop $R0
  402. ${If} $R0 == 0
  403. nsProcess::_KillProcess "${EXE_NAME}"
  404. #StrCpy $R8 "${PRODUCT_NAME} 正在运行,请退出后重试!"
  405. #StrCpy $R7 "0"
  406. #Call un.ShowMsgBox
  407. #nsProcess::_KillProcess "${EXE_NAME}"
  408. #goto InstallAbort
  409. ${EndIf}
  410. nsNiuniuSkin::ShowPage 0
  411. InstallAbort:
  412. FunctionEnd
  413. #绑定卸载的事件
  414. Function un.BindUnInstUIControls
  415. GetFunctionAddress $0 un.ExitDUIClose
  416. nsNiuniuSkin::BindCallBack $hInstallDlg "btnUninstalled" $0
  417. GetFunctionAddress $0 un.onUninstall
  418. nsNiuniuSkin::BindCallBack $hInstallDlg "btnUnInstall" $0
  419. GetFunctionAddress $0 un.ExitDUIClose
  420. nsNiuniuSkin::BindCallBack $hInstallDlg "btnClose" $0
  421. GetFunctionAddress $0 un.ExitDUISetup
  422. nsNiuniuSkin::BindCallBack $hInstallDlg "btnBuy" $0
  423. ${If} ${UNINSTALL_url} != ''
  424. nsNiuniuSkin::SetControlAttribute $hInstallDlg "oneclick_browser" "visible" "false"
  425. Call un.CheckWebStatus
  426. ${EndIf}
  427. FunctionEnd
  428. # 卸载界面显示网页,如果客户没有联网则不显示,联网则显示
  429. Function un.CheckWebStatus
  430. NSxfer::Request /URL "${UNINSTALL_url}" /INTERNET_OPTION_CONNECT_TIMEOUT 3000 /LOCAL NONE /MODE SILENT /END
  431. Pop $0 ;
  432. NSxfer::Wait /ID $0 /MODE SILENT /END
  433. NSxfer::Query /ID $0 /ERRORCODE /PERCENT /SPEED /END
  434. Pop $R0 ; Error code (HTTP status 200-299 for success)
  435. ${If} $R0 < 200
  436. ${OrIf} $R0 > 299
  437. ${Else}
  438. Sleep 100;
  439. nsNiuniuSkin::SetControlAttribute $hInstallDlg "oneclick_browser" "visible" "true"
  440. StrCpy $isPreference "true" #优惠网页显示
  441. ${EndIf}
  442. FunctionEnd
  443. Function un.ExitDUISetup
  444. ${If} $isPreference == "true"
  445. # 写入一个日志文件
  446. LogEx::Init "$TEMP\${INSTALL_APPEND_PATH}"
  447. Exec "$INSTDIR\${EXE_NAME}"
  448. ${EndIf}
  449. nsNiuniuSkin::ExitDUISetup
  450. FunctionEnd
  451. Function un.ExitDUIClose
  452. nsNiuniuSkin::ExitDUISetup
  453. FunctionEnd
  454. #执行具体的卸载
  455. Function un.onUninstall
  456. nsNiuniuSkin::GetControlAttribute $hInstallDlg "chkReserveData" "selected"
  457. Pop $0
  458. StrCpy $sReserveData $0
  459. nsNiuniuSkin::SetControlAttribute $hInstallDlg "btnClose" "enabled" "false"
  460. nsNiuniuSkin::SetControlAttribute $hInstallDlg "lblInstalling" "text" "正在卸载..."
  461. nsNiuniuSkin::ShowPageItem $hInstallDlg "wizardTab" ${INSTALL_PAGE_UNISTPROCESSING}
  462. nsNiuniuSkin::SetControlAttribute $hInstallDlg "slrProgress" "min" "0"
  463. nsNiuniuSkin::SetControlAttribute $hInstallDlg "slrProgress" "max" "100"
  464. IntOp $UnInstallValue 0 + 1
  465. #卸载统计
  466. Call un.Statistics
  467. Call un.DeleteShotcutAndInstallInfo
  468. IntOp $UnInstallValue $UnInstallValue + 8
  469. #删除文件
  470. GetFunctionAddress $0 un.RemoveFiles
  471. BgWorker::CallAndWait
  472. InstallAbort:
  473. FunctionEnd
  474. #在线程中删除文件,以便显示进度
  475. Function un.RemoveFiles
  476. ${Locate} "$INSTDIR" "/G=0 /M=*.*" "un.onDeleteFileFound"
  477. StrCpy $InstallState "1"
  478. nsNiuniuSkin::SetControlAttribute $hInstallDlg "btnClose" "enabled" "true"
  479. nsNiuniuSkin::SetControlAttribute $hInstallDlg "slrUnInstProgress" "value" "100"
  480. nsNiuniuSkin::ShowPageItem $hInstallDlg "wizardTab" ${INSTALL_PAGE_UNISTFINISH}
  481. FunctionEnd
  482. #卸载程序时删除文件的流程,如果有需要过滤的文件,在此函数中添加
  483. Function un.onDeleteFileFound
  484. ; $R9 "path\name"
  485. ; $R8 "path"
  486. ; $R7 "name"
  487. ; $R6 "size" ($R6 = "" if directory, $R6 = "0" if file with /S=)
  488. #是否过滤删除
  489. Delete "$R9"
  490. RMDir /r "$R9"
  491. RMDir "$R9"
  492. IntOp $UnInstallValue $UnInstallValue + 2
  493. ${If} $UnInstallValue > 100
  494. IntOp $UnInstallValue 100 + 0
  495. nsNiuniuSkin::SetControlAttribute $hInstallDlg "slrUnInstProgress" "value" "100"
  496. ${Else}
  497. nsNiuniuSkin::SetControlAttribute $hInstallDlg "slrUnInstProgress" "value" "$UnInstallValue"
  498. Sleep 100
  499. ${EndIf}
  500. undelete:
  501. Push "LocateNext"
  502. FunctionEnd
  503. Function un.ShowMsgBox
  504. nsNiuniuSkin::InitSkinSubPage "msgBox.xml" "btnOK" "btnCancel,btnClose" ; "提示" "${PRODUCT_NAME} 正在运行,请退出后重试!" 0
  505. Pop $hInstallSubDlg
  506. nsNiuniuSkin::SetControlAttribute $hInstallSubDlg "lblTitle" "text" "提示"
  507. nsNiuniuSkin::SetControlAttribute $hInstallSubDlg "lblMsg" "text" "$R8"
  508. ${If} "$R7" == "1"
  509. nsNiuniuSkin::SetControlAttribute $hInstallSubDlg "hlCancel" "visible" "true"
  510. ${EndIf}
  511. nsNiuniuSkin::ShowSkinSubPage 0
  512. FunctionEnd
  513. ##################################################
  514. Function sendStatistics
  515. # 操作系统 x86 x64
  516. ReadRegStr $0 HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment" "PROCESSOR_ARCHITECTURE"
  517. # 操作系统版本序号
  518. ReadRegStr $1 HKLM "SOFTWARE\Microsoft\Windows NT\CurrentVersion" ProductName
  519. # 操作系统 产品id
  520. ReadRegStr $2 HKLM "SOFTWARE\Microsoft\Windows NT\CurrentVersion" "ProductId"
  521. # 操作系统 系统id
  522. ReadRegStr $3 HKLM "SOFTWARE\Microsoft\Cryptography" "MachineGuid"
  523. NSxfer::Transfer /URL "${STATISTICS_url}?type=1&soft_mid=${PRODUCT_MID}&soft_name=${PRODUCT_VERSION}&mac=$3_$2&os_platform=$1&os_arch=$0" /LOCAL NONE /METHOD POST /HEADERS "Content-Type: application/json" /DATA '{"kk":11,"aa":"www"}' /END
  524. Pop $1 ; Request ID1
  525. FunctionEnd
  526. Function un.Statistics
  527. # 操作系统 x86 x64
  528. ReadRegStr $0 HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment" "PROCESSOR_ARCHITECTURE"
  529. # 操作系统版本序号
  530. ReadRegStr $1 HKLM "SOFTWARE\Microsoft\Windows NT\CurrentVersion" ProductName
  531. # 操作系统 产品id
  532. ReadRegStr $2 HKLM "SOFTWARE\Microsoft\Windows NT\CurrentVersion" "ProductId"
  533. # 操作系统 系统id
  534. ReadRegStr $3 HKLM "SOFTWARE\Microsoft\Cryptography" "MachineGuid"
  535. NSxfer::Transfer /URL "${STATISTICS_url}?type=2&soft_mid=${PRODUCT_MID}&soft_name=${PRODUCT_VERSION}&mac=$3_$2&os_platform=$1&os_arch=$0" /LOCAL NONE /METHOD POST /HEADERS "Content-Type: application/json" /DATA '{"kk":11,"aa":"www"}' /END
  536. Pop $1 ; Request ID1
  537. FunctionEnd