test.nsh 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668
  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. # 操作系统 x86 x64 下载对应的安装包 AMD64
  188. ReadRegStr $0 HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment" "PROCESSOR_ARCHITECTURE"
  189. ${if} $0 == 'x86'
  190. NSxfer::Request /URL "https://xy.xingyousoft.com/soft/XYVideo/lastest_ia32_${PRODUCT_VERSION}.7z" /LOCAL "$INSTDIR\${INSTALL_7Z_NAME}" /TIMEOUTCONNECT 6000 /TIMEOUTRECONNECT 6000 /END
  191. ${else}
  192. NSxfer::Request /URL "https://xy.xingyousoft.com/soft/XYVideo/lastest_x64_${PRODUCT_VERSION}.7z" /LOCAL "$INSTDIR\${INSTALL_7Z_NAME}" /TIMEOUTCONNECT 6000 /TIMEOUTRECONNECT 6000 /END
  193. ${Endif}
  194. #NSxfer::Request /URL "${APP_DOWNLOAD_URL}" /LOCAL "$INSTDIR\${INSTALL_7Z_NAME}" /TIMEOUTCONNECT 6000 /TIMEOUTRECONNECT 6000 /END
  195. Pop $3 ; Request ID1
  196. Call TimerDownloadInfiniteLoop
  197. NSxfer::Wait /ID $3 /MODE SILENT /END
  198. NSxfer::Query /ID $3 /ERRORCODE /PERCENT /SPEED /END
  199. Pop $R0 ; Error code (HTTP status 200-299 for success)
  200. ${If} $R0 < 200
  201. ${OrIf} $R0 > 299
  202. ThreadTimer::Stop
  203. MessageBox MB_OKCANCEL "$R0 下载出错,请确保网络连接正常,然后再试!" IDOK trueValue IDCANCEL falseValue
  204. trueValue:
  205. Call DownloadApp
  206. Goto next
  207. falseValue:
  208. nsNiuniuSkin::ExitDUISetup
  209. next:
  210. ${EndIf}
  211. ThreadTimer::Stop # 下载完成,关闭定时器
  212. FunctionEnd
  213. # 定时器,检测下载,显示进度条
  214. Function TimerDownloadInfiniteLoop
  215. GetFunctionAddress $2 TryMe
  216. ThreadTimer::Start 100 -1 $2 ; Timer ticks every 1234 milliseconds, it calls function TryMe in infinite loop until ThreadTimer::Stop is called
  217. FunctionEnd
  218. Function TryMe
  219. NSxfer::Query /ID $3 /ERRORCODE /PERCENT /SPEED /END
  220. Pop $R0 ; Error code (HTTP status 200-299 for success)
  221. Pop $R1
  222. Pop $R2
  223. ${If} $R0 < '299'
  224. nsNiuniuSkin::SetControlAttribute $hInstallDlg "processname" "text" "解压中 ... $R2"
  225. nsNiuniuSkin::SetControlAttribute $hInstallDlg "slrProgress" "value" "$R1"
  226. ${Else}
  227. nsNiuniuSkin::SetControlAttribute $hInstallDlg "processname" "text" "解压出错,请重试!err: $R0"
  228. ${EndIf}
  229. FunctionEnd
  230. #############################################################
  231. Function CreateShortcut
  232. SetShellVarContext all
  233. #electron 如果app文件夹存在,则删除,为了避免app,app.asar出现冲突的情况
  234. ${If} ${FIleExists} "$INSTDIR\resources\app"
  235. RMDir /r "$INSTDIR\resources\app"
  236. ${EndIf}
  237. CreateDirectory "$SMPROGRAMS\${PRODUCT_NAME}"
  238. CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\${PRODUCT_NAME}.lnk" "$INSTDIR\${EXE_NAME}"
  239. CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\卸载${PRODUCT_NAME}.lnk" "$INSTDIR\uninst.exe"
  240. # 锁定任务栏
  241. Call createTaskBar
  242. #根据复选框的值来决定是否添加桌面快捷方式
  243. nsNiuniuSkin::GetControlAttribute $hInstallDlg "chkShotcut" "selected"
  244. Pop $R0
  245. ${If} $R0 == "1"
  246. Call CreateDeskTopIco
  247. ${EndIf}
  248. #添加到快速启动栏
  249. nsNiuniuSkin::GetControlAttribute $hInstallDlg "chkQuickStart" "selected"
  250. Pop $R0
  251. ${If} $R0 == "1"
  252. Call CreateBarlnk
  253. ${EndIf}
  254. # 开机启动
  255. nsNiuniuSkin::GetControlAttribute $hInstallDlg "chkAutoRun" "selected"
  256. Pop $R0
  257. ${If} $R0 == "1"
  258. Call CreateBootStart
  259. ${EndIf}
  260. #刷新关联图标
  261. Call RefreshShellIcons
  262. FunctionEnd
  263. #安装界面点击退出,给出提示
  264. Function OnExitDUISetup
  265. ${If} $InstallState == "0"
  266. StrCpy $R8 "安装尚未完成,您确定退出安装么?"
  267. StrCpy $R7 "1"
  268. Call ShowMsgBox
  269. pop $0
  270. ${If} $0 == 0
  271. goto endfun
  272. ${EndIf}
  273. ${EndIf}
  274. nsNiuniuSkin::ExitDUISetup
  275. endfun:
  276. FunctionEnd
  277. Function OnBtnMin
  278. SendMessage $hInstallDlg ${WM_SYSCOMMAND} 0xF020 0
  279. FunctionEnd
  280. Function OnBtnCancel
  281. nsNiuniuSkin::ExitDUISetup
  282. FunctionEnd
  283. Function OnFinished
  284. #立即启动
  285. #Exec "$INSTDIR\${EXE_NAME}"
  286. System::Call 'shell32::ShellExecute(i 0, t"open", t"explorer.exe", t" /e,${EXE_NAME}", t"$INSTDIR\\", i 0)'
  287. Call OnExitDUISetup
  288. FunctionEnd
  289. Function OnBtnDirPre
  290. FunctionEnd
  291. Function OnBtnSelectDir
  292. nsNiuniuSkin::SelectInstallDirEx $hInstallDlg "请选择安装路径"
  293. Pop $0
  294. ${Unless} "$0" == ""
  295. nsNiuniuSkin::SetControlAttribute $hInstallDlg "editDir" "text" $0
  296. ${EndUnless}
  297. FunctionEnd
  298. Function StepHeightSizeAsc
  299. ${ForEach} $R0 410 500 + 10
  300. nsNiuniuSkin::SetWindowSize $hInstallDlg 570 $R0
  301. Sleep 20
  302. ${Next}
  303. FunctionEnd
  304. Function StepHeightSizeDsc
  305. ${ForEach} $R0 500 410 - 10
  306. nsNiuniuSkin::SetWindowSize $hInstallDlg 570 $R0
  307. Sleep 20
  308. ${Next}
  309. FunctionEnd
  310. Function OnBtnShowMore
  311. nsNiuniuSkin::SetControlAttribute $hInstallDlg "moreconfiginfo" "visible" "true"
  312. nsNiuniuSkin::SetControlAttribute $hInstallDlg "btnShowMore" "visible" "false"
  313. nsNiuniuSkin::SetControlAttribute $hInstallDlg "btnHideMore" "visible" "true"
  314. ;调整窗口高度
  315. GetFunctionAddress $0 StepHeightSizeAsc
  316. BgWorker::CallAndWait
  317. nsNiuniuSkin::SetWindowSize $hInstallDlg 570 500
  318. FunctionEnd
  319. Function OnBtnHideMore
  320. nsNiuniuSkin::SetControlAttribute $hInstallDlg "moreconfiginfo" "visible" "false"
  321. nsNiuniuSkin::SetControlAttribute $hInstallDlg "btnShowMore" "visible" "true"
  322. nsNiuniuSkin::SetControlAttribute $hInstallDlg "btnHideMore" "visible" "false"
  323. ;调整窗口高度
  324. GetFunctionAddress $0 StepHeightSizeDsc
  325. BgWorker::CallAndWait
  326. nsNiuniuSkin::SetWindowSize $hInstallDlg 570 410
  327. FunctionEnd
  328. Function OnBtnShowConfig
  329. nsNiuniuSkin::SetControlAttribute $hInstallDlg "licenseshow" "visible" "false"
  330. FunctionEnd
  331. #根据选中的情况来控制按钮是否灰度显示
  332. Function OnCheckLicenseClick
  333. nsNiuniuSkin::GetControlAttribute $hInstallDlg "chkAgree" "selected"
  334. Pop $0
  335. ${If} $0 == "0"
  336. nsNiuniuSkin::SetControlAttribute $hInstallDlg "btnInstall" "enabled" "true"
  337. #${Else}
  338. # nsNiuniuSkin::SetControlAttribute $hInstallDlg "btnInstall" "enabled" "false"
  339. ${EndIf}
  340. FunctionEnd
  341. Function OnBtnLicenseClick
  342. ;nsNiuniuSkin::ShowPageItem "wizardTab" ${INSTALL_PAGE_LICENSE}
  343. nsNiuniuSkin::SetControlAttribute $hInstallDlg "licenseshow" "visible" "true"
  344. nsNiuniuSkin::GetControlAttribute $hInstallDlg "moreconfiginfo" "visible"
  345. Pop $0
  346. ${If} $0 = 0
  347. ;pos="10,35,560,405"
  348. nsNiuniuSkin::SetControlAttribute $hInstallDlg "licenseshow" "pos" "10,35,560,405"
  349. nsNiuniuSkin::SetControlAttribute $hInstallDlg "editLicense" "height" "295"
  350. ${Else}
  351. nsNiuniuSkin::SetControlAttribute $hInstallDlg "licenseshow" "pos" "10,35,560,495"
  352. nsNiuniuSkin::SetControlAttribute $hInstallDlg "editLicense" "height" "385"
  353. ${EndIf}
  354. FunctionEnd
  355. #此处是路径变化时的事件通知
  356. Function OnRichEditTextChange
  357. #可在此获取路径,判断是否合法等处理
  358. FunctionEnd
  359. #CTRL+F4关闭时的事件通知
  360. Function OnSysCommandCloseEvent
  361. Call OnExitDUISetup
  362. FunctionEnd
  363. Function ExtractCallback
  364. Pop $1
  365. Pop $2
  366. System::Int64Op $1 * 100
  367. Pop $3
  368. System::Int64Op $3 / $2
  369. Pop $0
  370. nsNiuniuSkin::SetControlAttribute $hInstallDlg "slrProgress" "value" "$0"
  371. ${If} $1 == $2
  372. nsNiuniuSkin::SetControlAttribute $hInstallDlg "slrProgress" "value" "100"
  373. ${EndIf}
  374. FunctionEnd
  375. Function ShowMsgBox
  376. nsNiuniuSkin::InitSkinSubPage "msgBox.xml" "btnOK" "btnCancel,btnClose" ; "提示" "${PRODUCT_NAME} 正在运行,请退出后重试!" 0
  377. Pop $hInstallSubDlg
  378. nsNiuniuSkin::SetControlAttribute $hInstallSubDlg "lblTitle" "text" "提示"
  379. nsNiuniuSkin::SetControlAttribute $hInstallSubDlg "lblMsg" "text" "$R8"
  380. ${If} "$R7" == "1"
  381. nsNiuniuSkin::SetControlAttribute $hInstallSubDlg "hlCancel" "visible" "true"
  382. ${EndIf}
  383. nsNiuniuSkin::ShowSkinSubPage 0
  384. FunctionEnd
  385. ########################################################
  386. Function un.onInit
  387. ;创建互斥防止重复运行
  388. System::Call 'kernel32::CreateMutexA(i 0, i 0, t "aceuiUnInstall") i .r1 ?e'
  389. Pop $R0
  390. StrCmp $R0 0 +3
  391. MessageBox MB_OK "有一个 ${PRODUCT_NAME} 卸载向导已经运行!"
  392. Abort
  393. FunctionEnd
  394. Function un.DUIPage
  395. StrCpy $InstallState "0"
  396. InitPluginsDir
  397. SetOutPath "$PLUGINSDIR"
  398. File "${INSTALL_RES_PATH}"
  399. nsNiuniuSkin::InitSkinPage "$PLUGINSDIR\" ""
  400. Pop $hInstallDlg
  401. nsNiuniuSkin::ShowPageItem $hInstallDlg "wizardTab" ${INSTALL_PAGE_UNISTCONFIG}
  402. #设置安装包的标题及任务栏显示
  403. nsNiuniuSkin::SetWindowTile $hInstallDlg "${PRODUCT_NAME}卸载程序"
  404. nsNiuniuSkin::SetWindowSize $hInstallDlg 570 400
  405. Call un.BindUnInstUIControls
  406. #此处检测当前是否有程序正在运行,如果正在运行,提示先卸载再安装
  407. nsProcess::_FindProcess "${EXE_NAME}"
  408. Pop $R0
  409. ${If} $R0 == 0
  410. nsProcess::_KillProcess "${EXE_NAME}"
  411. #StrCpy $R8 "${PRODUCT_NAME} 正在运行,请退出后重试!"
  412. #StrCpy $R7 "0"
  413. #Call un.ShowMsgBox
  414. #nsProcess::_KillProcess "${EXE_NAME}"
  415. #goto InstallAbort
  416. ${EndIf}
  417. nsNiuniuSkin::ShowPage 0
  418. InstallAbort:
  419. FunctionEnd
  420. #绑定卸载的事件
  421. Function un.BindUnInstUIControls
  422. GetFunctionAddress $0 un.ExitDUIClose
  423. nsNiuniuSkin::BindCallBack $hInstallDlg "btnUninstalled" $0
  424. GetFunctionAddress $0 un.onUninstall
  425. nsNiuniuSkin::BindCallBack $hInstallDlg "btnUnInstall" $0
  426. GetFunctionAddress $0 un.ExitDUIClose
  427. nsNiuniuSkin::BindCallBack $hInstallDlg "btnClose" $0
  428. GetFunctionAddress $0 un.ExitDUISetup
  429. nsNiuniuSkin::BindCallBack $hInstallDlg "btnBuy" $0
  430. ${If} ${UNINSTALL_url} != ''
  431. nsNiuniuSkin::SetControlAttribute $hInstallDlg "oneclick_browser" "visible" "false"
  432. Call un.CheckWebStatus
  433. ${EndIf}
  434. FunctionEnd
  435. # 卸载界面显示网页,如果客户没有联网则不显示,联网则显示
  436. Function un.CheckWebStatus
  437. NSxfer::Request /URL "${UNINSTALL_url}" /INTERNET_OPTION_CONNECT_TIMEOUT 3000 /LOCAL NONE /MODE SILENT /END
  438. Pop $0 ;
  439. NSxfer::Wait /ID $0 /MODE SILENT /END
  440. NSxfer::Query /ID $0 /ERRORCODE /PERCENT /SPEED /END
  441. Pop $R0 ; Error code (HTTP status 200-299 for success)
  442. ${If} $R0 < 200
  443. ${OrIf} $R0 > 299
  444. ${Else}
  445. Sleep 100;
  446. nsNiuniuSkin::SetControlAttribute $hInstallDlg "oneclick_browser" "visible" "true"
  447. StrCpy $isPreference "true" #优惠网页显示
  448. ${EndIf}
  449. FunctionEnd
  450. Function un.ExitDUISetup
  451. ${If} $isPreference == "true"
  452. # 写入一个日志文件
  453. LogEx::Init "$TEMP\${INSTALL_APPEND_PATH}"
  454. Exec "$INSTDIR\${EXE_NAME}"
  455. ${EndIf}
  456. nsNiuniuSkin::ExitDUISetup
  457. FunctionEnd
  458. Function un.ExitDUIClose
  459. nsNiuniuSkin::ExitDUISetup
  460. FunctionEnd
  461. #执行具体的卸载
  462. Function un.onUninstall
  463. nsNiuniuSkin::GetControlAttribute $hInstallDlg "chkReserveData" "selected"
  464. Pop $0
  465. StrCpy $sReserveData $0
  466. nsNiuniuSkin::SetControlAttribute $hInstallDlg "btnClose" "enabled" "false"
  467. nsNiuniuSkin::SetControlAttribute $hInstallDlg "lblInstalling" "text" "正在卸载..."
  468. nsNiuniuSkin::ShowPageItem $hInstallDlg "wizardTab" ${INSTALL_PAGE_UNISTPROCESSING}
  469. nsNiuniuSkin::SetControlAttribute $hInstallDlg "slrProgress" "min" "0"
  470. nsNiuniuSkin::SetControlAttribute $hInstallDlg "slrProgress" "max" "100"
  471. IntOp $UnInstallValue 0 + 1
  472. #卸载统计
  473. Call un.Statistics
  474. Call un.DeleteShotcutAndInstallInfo
  475. IntOp $UnInstallValue $UnInstallValue + 8
  476. #删除文件
  477. GetFunctionAddress $0 un.RemoveFiles
  478. BgWorker::CallAndWait
  479. InstallAbort:
  480. FunctionEnd
  481. #在线程中删除文件,以便显示进度
  482. Function un.RemoveFiles
  483. ${Locate} "$INSTDIR" "/G=0 /M=*.*" "un.onDeleteFileFound"
  484. StrCpy $InstallState "1"
  485. nsNiuniuSkin::SetControlAttribute $hInstallDlg "btnClose" "enabled" "true"
  486. nsNiuniuSkin::SetControlAttribute $hInstallDlg "slrUnInstProgress" "value" "100"
  487. nsNiuniuSkin::ShowPageItem $hInstallDlg "wizardTab" ${INSTALL_PAGE_UNISTFINISH}
  488. FunctionEnd
  489. #卸载程序时删除文件的流程,如果有需要过滤的文件,在此函数中添加
  490. Function un.onDeleteFileFound
  491. ; $R9 "path\name"
  492. ; $R8 "path"
  493. ; $R7 "name"
  494. ; $R6 "size" ($R6 = "" if directory, $R6 = "0" if file with /S=)
  495. #是否过滤删除
  496. Delete "$R9"
  497. RMDir /r "$R9"
  498. RMDir "$R9"
  499. IntOp $UnInstallValue $UnInstallValue + 2
  500. ${If} $UnInstallValue > 100
  501. IntOp $UnInstallValue 100 + 0
  502. nsNiuniuSkin::SetControlAttribute $hInstallDlg "slrUnInstProgress" "value" "100"
  503. ${Else}
  504. nsNiuniuSkin::SetControlAttribute $hInstallDlg "slrUnInstProgress" "value" "$UnInstallValue"
  505. Sleep 100
  506. ${EndIf}
  507. undelete:
  508. Push "LocateNext"
  509. FunctionEnd
  510. Function un.ShowMsgBox
  511. nsNiuniuSkin::InitSkinSubPage "msgBox.xml" "btnOK" "btnCancel,btnClose" ; "提示" "${PRODUCT_NAME} 正在运行,请退出后重试!" 0
  512. Pop $hInstallSubDlg
  513. nsNiuniuSkin::SetControlAttribute $hInstallSubDlg "lblTitle" "text" "提示"
  514. nsNiuniuSkin::SetControlAttribute $hInstallSubDlg "lblMsg" "text" "$R8"
  515. ${If} "$R7" == "1"
  516. nsNiuniuSkin::SetControlAttribute $hInstallSubDlg "hlCancel" "visible" "true"
  517. ${EndIf}
  518. nsNiuniuSkin::ShowSkinSubPage 0
  519. FunctionEnd
  520. ##################################################
  521. Function sendStatistics
  522. # 操作系统 x86 x64
  523. ReadRegStr $0 HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment" "PROCESSOR_ARCHITECTURE"
  524. # 操作系统版本序号
  525. ReadRegStr $1 HKLM "SOFTWARE\Microsoft\Windows NT\CurrentVersion" ProductName
  526. # 操作系统 产品id
  527. ReadRegStr $2 HKLM "SOFTWARE\Microsoft\Windows NT\CurrentVersion" "ProductId"
  528. # 操作系统 系统id
  529. ReadRegStr $3 HKLM "SOFTWARE\Microsoft\Cryptography" "MachineGuid"
  530. 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
  531. Pop $1 ; Request ID1
  532. FunctionEnd
  533. Function un.Statistics
  534. # 操作系统 x86 x64
  535. ReadRegStr $0 HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment" "PROCESSOR_ARCHITECTURE"
  536. # 操作系统版本序号
  537. ReadRegStr $1 HKLM "SOFTWARE\Microsoft\Windows NT\CurrentVersion" ProductName
  538. # 操作系统 产品id
  539. ReadRegStr $2 HKLM "SOFTWARE\Microsoft\Windows NT\CurrentVersion" "ProductId"
  540. # 操作系统 系统id
  541. ReadRegStr $3 HKLM "SOFTWARE\Microsoft\Cryptography" "MachineGuid"
  542. 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
  543. Pop $1 ; Request ID1
  544. FunctionEnd