; 安装程序初始定义常量 !define PRODUCT_NAME "千目容器" !define PRODUCT_VERSION "V2.1" !define PRODUCT_PUBLISHER "千目容器" !define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}" !define PRODUCT_UNINST_ROOT_KEY "HKLM" !define PRODUCT_STARTMENU_REGVAL "NSIS:StartMenuDir" SetCompressor /SOLID lzma ; ------ MUI 现代界面定义 (1.67 版本以上兼容) ------ !include "MUI.nsh" !include "MUI2.nsh" !include "FileFunc.nsh" !include "MUI2.nsh" !include "WinCore.nsh" !include "WinCore.nsh" !include "nsWindows.nsh" !include "LogicLib.nsh" !include "TextReplace.nsh" !include "WordFunc.nsh" !include "x64.nsh" ;!include "WinVer.nsh" ;!insertmacro MUI_LANGUAGE "simpchinese" !define MUI_HEADERIMAGE_BITMAP_NOSTRETCH ; MUI 预定义常量 !define MUI_ABORTWARNING !define MUI_HEADERIMAGE !define MUI_ICON "Sources\1000mu.ico" !define MUI_UNICON "Sources\removico1000mu.ico" !define MUI_WELCOMEFINISHPAGE_BITMAP "Sources\dlgbmp.bmp" !define MUI_UNWELCOMEFINISHPAGE_BITMAP "Sources\dlgbmp.bmp" #!define MUI_HEADERIMAGE !define MUI_HEADER_TRANSPARENT_TEXT ;文字背景透明 !define MUI_HEADERIMAGE_BITMAP "Sources\banner.bmp" ;大小 500X60 #!define MUI_HEADERIMAGE_UNBITMAP "Sources\orange-uninstall.bmp" ; ------ 自定义页面 ------ Var ipAddress Var ipAddress1 Var ipAddress2 ;Var pic_count Var BGImage Var MiddleImage ;中间的大Logo Var ImageHandle Var disk Var disk1 ;---------------------------全局编译脚本预定义的常量----------------------------------------------------- ; 欢迎页面 --- 这里调整页面顺序 --- !insertmacro MUI_PAGE_WELCOME ; 许可协议页面 !define MUI_PAGE_HEADER_TEXT "最终用户许可协议" !define MUI_PAGE_HEADER_SUBTEXT "您必须接受此协议才能继续安装!" !insertmacro MUI_PAGE_LICENSE "Sources\License.rtf" ; 安装目录选择页面 !insertmacro MUI_PAGE_DIRECTORY ; 组件选择页面 ;!insertmacro MUI_PAGE_COMPONENTS ; 开始菜单设置页面 var ICONS_GROUP !define MUI_STARTMENUPAGE_NODISABLE !define MUI_STARTMENUPAGE_DEFAULTFOLDER "千目容器" !define MUI_STARTMENUPAGE_REGISTRY_ROOT "${PRODUCT_UNINST_ROOT_KEY}" !define MUI_STARTMENUPAGE_REGISTRY_KEY "${PRODUCT_UNINST_KEY}" !define MUI_STARTMENUPAGE_REGISTRY_VALUENAME "${PRODUCT_STARTMENU_REGVAL}" !insertmacro MUI_PAGE_STARTMENU Application $ICONS_GROUP ; 安装过程页面 !define MUI_PAGE_CUSTOMFUNCTION_PRE ExtractFiles ;------------------ 安装过程,图片轮训页面 !define MUI_PAGE_CUSTOMFUNCTION_SHOW CreateStaticRect !insertmacro MUI_PAGE_INSTFILES ; 安装过程页面 ; 安装完成页面 !insertmacro MUI_PAGE_FINISH ; 安装卸载过程页面 !insertmacro MUI_UNPAGE_WELCOME !insertmacro MUI_UNPAGE_INSTFILES !insertmacro MUI_UNPAGE_FINISH ; 安装界面包含的语言设置 !insertmacro MUI_LANGUAGE "SimpChinese" ; 安装预释放文件 !insertmacro MUI_RESERVEFILE_INSTALLOPTIONS ; ------ MUI 现代界面定义结束 ------ ; ------ 自定义页面 ------ ;多用户安装 ;使用SetShellVarContext all 将快捷方式创建到alluser的开始菜单中 ;SetShellVarContext all ;----------------------------------------------------------------------------------------------- Name "${PRODUCT_NAME} ${PRODUCT_VERSION}" OutFile "千目容器1.0.exe" InstallDirRegKey HKLM "${PRODUCT_UNINST_KEY}" "UninstallString" ;ShowInstDetails show ShowInstDetails NeverShow ShowUninstDetails show BrandingText "千目容器" ;获取管理员权限 RequestExecutionLevel admin Section "驱动程序" SEC01 nsExec::Exec "$INSTDIR\Uninstall.bat" SetOutPath "$INSTDIR" SetOverwrite on ${WordFind2X} ":$INSTDIR" ":" ":" "-1" $R1 ;提取输入的ip,后面function使用 StrCpy $disk1 $R1 ; MessageBox MB_OK "$disk1" File /r "G:\打包\发布\iot分屏\1000mu\*.*" ; !insertmacro MUI_STARTMENU_WRITE_BEGIN Application ; CreateDirectory "AllPass" ; SetOutPath "$INSTDIR\AllPass.SignalR.Hardware.Client" ; CreateShortCut "$desktop\启动硬件程序.lnk" "$INSTDIR\AllPass.SignalR.Hardware.Client\硬件程序启动脚本_客户端.bat" "" ;!insertmacro MUI_STARTMENU_WRITE_END SectionIn RO SectionEnd Section -AdditionalIcons !insertmacro MUI_STARTMENU_WRITE_BEGIN Application ; MessageBox MB_OK "$INSTDIR" ; WriteINIStr "$INSTDIR\${PRODUCT_NAME}.url" "InternetShortcut" "URL" "${PRODUCT_WEB_SITE}" CreateDirectory "$SMPROGRAMS\$ICONS_GROUP" SetOutPath "$INSTDIR\IOTContainer" CreateShortCut "$SMPROGRAMS\$ICONS_GROUP\千目容器.lnk" "$INSTDIR\IOTContainer\IOTContainer.exe" !insertmacro MUI_STARTMENU_WRITE_END SectionEnd Section -Post WriteRegStr HKCU "Software\QianMuContainer" "address" $INSTDIR WriteUninstaller "$INSTDIR\卸载千目应用.exe" WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayName" "$(^Name)" WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "UninstallString" "$INSTDIR\卸载千目应用.exe" WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayVersion" "${PRODUCT_VERSION}" WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "URLInfoAbout" "http://www.baidu.com" WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "Publisher" "${PRODUCT_PUBLISHER}" SectionEnd ; ------自定更新IIS配置, web.config 配置 Section -Main DetailPrint "正在安装,请稍等。" /* Sleep 10000 Sleep 10000 Sleep 10000 Sleep 10000 Sleep 10000 Sleep 10000 Sleep 10000 Sleep 10000 Sleep 10000 Sleep 10000 Sleep 10000 Sleep 10000 Sleep 10000 Sleep 10000 Sleep 10000 Sleep 10000 Sleep 10000 Sleep 10000 Sleep 10000 Sleep 10000 Sleep 10000 Sleep 10000 Sleep 10000 Sleep 10000 Sleep 10000 Sleep 10000 Sleep 10000 Sleep 10000 Sleep 10000 Sleep 10000 Sleep 10000 Sleep 10000 Sleep 10000 Sleep 10000 */ SectionEnd Section "服务程序" ;WriteRegStr HKLM Software\Microsoft\Windows\CurrentVersion\Run Shell $INSTDIR\硬件驱动及通信程序\AllPass.SignalR.Hardware.Client\硬件程序启动脚本_客户端.bat call GetWindowsVersion Pop $R0 ${If} $R0 == 'XP' ;CopyFiles $SMPROGRAMS\$ICONS_GROUP\千目容器.lnk "C:\Documents and Settings\All users\「开始」菜单\程序\启动" ${ElseIf} $R0 == '2003' ;CopyFiles $SMPROGRAMS\$ICONS_GROUP\千目容器.lnk "C:\Documents and Settings\All users\「开始」菜单\程序\启动" ${Else} ;CopyFiles $SMPROGRAMS\$ICONS_GROUP\千目容器.lnk "C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp" ${EndIf} SectionIn RO SectionEnd ; 区段组件描述 !insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN !insertmacro MUI_DESCRIPTION_TEXT ${SEC01} "安装文件" !insertmacro MUI_DESCRIPTION_TEXT ${IIS} "驱动安装程序" !insertmacro MUI_FUNCTION_DESCRIPTION_END /****************************** * 以下是安装程序的卸载部分 * ******************************/ Section Uninstall !insertmacro MUI_STARTMENU_GETFOLDER "Application" $ICONS_GROUP Delete "$SMPROGRAMS\$ICONS_GROUP\软件卸载.lnk" Delete "$SMPROGRAMS\$ICONS_GROUP\启动硬件程序.lnk" RMDir /r "$SMPROGRAMS\$ICONS_GROUP" delete "C:\Documents and Settings\All users\「开始」菜单\程序\启动\千目容器.lnk" delete "C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp\千目容器.lnk" ; ${WordFind2X} "\$INSTDIR" "\" "\" "-1" $R1 ;提取输入的ip,后面function使用 SetOutPath "$INSTDIR" nsExec::Exec "$INSTDIR\Uninstall.bat" RMDir /r "$INSTDIR\IOTContainer" RMDir /r "$INSTDIR\log" RMDir /r "$INSTDIR" delete "$INSTDIR\卸载千目应用.exe" DeleteRegKey /ifempty HKCU "Software\QianMuContainer" DeleteRegKey ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" SectionEnd #-- 根据 NSIS 脚本编辑规则,所有 Function 区段必须放置在 Section 区段之后编写,以避免安装程序出现未可预知的问题。--# Function un.onInit MessageBox MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2 "您确实要完全移除 $(^Name)及其所有的组件?" IDYES +2 Abort FunctionEnd Function un.onUninstSuccess HideWindow MessageBox MB_ICONINFORMATION|MB_OK "$(^Name) 已成功地从您的计算机移除。" FunctionEnd ;------------------------------------------------------------------- ;安装.exe为你想检测的可执行文件 Function .onInit ; ------ 自定义页面 ------ ${GetDrives} "HDD" "FindHDD" ReadRegStr $INSTDIR HKCU \ "Software\QianMuContainer" address ${If} $INSTDIR == '' StrCpy $INSTDIR $R2Container ;${Else} ${EndIf} StrCpy $disk $R2 ;${WordFind2X} ":$disk" ":" ":" "-1" $R1 ;提取输入的ip,后面function使用 ;StrCpy $disk1 $R1 File `/ONAME=$PLUGINSDIR\sed.exe` `Sources\sed.exe` ; SectionSetFlags ${autoStart} 0 ; 安装选项,默认勾选 1, 不勾选 0 #InitPluginsDir ;创建互斥防止重复运行 System::Call 'kernel32::CreateMutexA(i 0, i 0, t "$$OutFile") i .r1 ?e' Pop $R0 StrCmp $R0 0 +3 MessageBox MB_OK|MB_ICONEXCLAMATION "有一个安装向导已经运行!" Abort FunctionEnd Function "FindHDD" ;获取查找到的驱动器盘符($9)可用空间(/D=F)单位兆(/S=M) ${DriveSpace} $9 "/D=F /S=M" $R0 ${If} $R0 > $R1 StrCpy $R1 $R0 StrCpy $R2 $9 ${EndIf} Push $0 FunctionEnd Function GetWindowsVersion Push $R0 Push $R1 ClearErrors ReadRegStr $R0 HKLM \ "SOFTWARE\Microsoft\Windows NT\CurrentVersion" CurrentVersion IfErrors 0 lbl_winnt ; we are not NT ReadRegStr $R0 HKLM \ "SOFTWARE\Microsoft\Windows\CurrentVersion" VersionNumber StrCpy $R1 $R0 1 StrCmp $R1 '4' 0 lbl_error StrCpy $R1 $R0 3 StrCmp $R1 '4.0' lbl_win32_95 StrCmp $R1 '4.9' lbl_win32_ME lbl_win32_98 lbl_win32_95: StrCpy $R0 '95' Goto lbl_done lbl_win32_98: StrCpy $R0 '98' Goto lbl_done lbl_win32_ME: StrCpy $R0 'ME' Goto lbl_done lbl_winnt: StrCpy $R1 $R0 1 StrCmp $R1 '3' lbl_winnt_x StrCmp $R1 '4' lbl_winnt_x StrCpy $R1 $R0 3 StrCmp $R1 '5.0' lbl_winnt_2000 StrCmp $R1 '5.1' lbl_winnt_XP StrCmp $R1 '5.2' lbl_winnt_2003 StrCmp $R1 '6.0' lbl_winnt_vista StrCmp $R1 '6.1' lbl_winnt_win7 lbl_error lbl_winnt_x: StrCpy $R0 "NT $R0" 6 Goto lbl_done lbl_winnt_2000: Strcpy $R0 '2000' Goto lbl_done lbl_winnt_XP: Strcpy $R0 'XP' Goto lbl_done lbl_winnt_2003: Strcpy $R0 '2003' Goto lbl_done lbl_winnt_vista: Strcpy $R0 'Vista' Goto lbl_done lbl_winnt_win7: Strcpy $R0 'Win7' Goto lbl_done lbl_error: Strcpy $R0 '' lbl_done: Pop $R1 Exch $R0 FunctionEnd Function Replacewebconfig ;更改配置文件 web.config ClearErrors FileOpen $9 "c:\tmp\replace1.bat" w IfErrors done FileWrite $9 "@echo off$\r$\n" FileWrite $9 "setlocal enabledelayedexpansion$\r$\n" FileWrite $9 "set file=$\"$INSTDIR\IOTContainer\ConUpdate.exe.config$\"$\r$\n" FileWrite $9 "attrib -H -R %file%$\r$\n" FileWrite $9 "copy c:\tmp\sed.exe C:\Windows\System32 /y$logPath$\r$\n" FileWrite $9 "$disk1:$\r$\n" FileWrite $9 "sed -i $\"s@http://192.168.0.128:8889@$\"$ipAddress$\"@g$\" %file%$logPath$\r$\n" FileWrite $9 "echo ----- sed替换 HRCM web.config 替换库和 url ----- $logPath$\r$\n" FileClose $9 done: ${Unless} ${FileExists} "c:\tmp\replace1.bat" MessageBox MB_OK|MB_ICONSTOP "0replace1writting web.comfig file error!" Abort ${EndUnless} #ExecWait "c:\tmp\replace1.bat" ;不显示黑框框 nsExec::Exec "c:\tmp\replace1.bat" FunctionEnd ;--------sql server ---------- ; Function GetNextIp ; input: head of stack ; format: 'ip1;ip2;ip3;ip4;' ; output: 'ip1' head of stack ; 'ip2;ip3;ip4;' second entry of stack ; Function CheckIP ; input: IP-address on stack ; output: additional entry on stack ; 1 - LoopBack IP (localhost, indicates no connection to a LAN or to the internet). ; 2 - Automatic Private IP Address (no DHCP server). ; 3 - Network IP. ; 4 - Internet IP. ; Eg: ; Push '192.168.0.100' ; Call CheckIP ; Pop $0 ; Contains '3' ; Pop $1 ; Contains '192.168.0.100' ; Function VersionCheck ; input: 'v1', 'v2' on stack ; output 1 - if number 1 is newer ; 2 - if number 2 is newer ; 0 - if it is the same verion ; Eg: ; Push '3.5.1.4' ; Push '3.5' ; Call VersionCheck ; Pop $0 ; now contains 1 ;------------------------- /* Function LEAVE ;按下一步按钮时消隐标题字。图片号+1 GetDlgItem $0 $HWNDPARENT 1037 ShowWindow $0 0 GetDlgItem $0 $HWNDPARENT 1038 ShowWindow $0 0 IntOp $pic_count $pic_count + 1 SetBrandingImage /IMGID=1046 /RESIZETOFIT "$PLUGINSDIR\$pic_count.bmp" FunctionEnd Function Back ;按上一步按钮时消隐标题字。图片号-1,如果小于1的话不减了 GetDlgItem $0 $HWNDPARENT 1037 ShowWindow $0 0 GetDlgItem $0 $HWNDPARENT 1038 ShowWindow $0 0 IntCmp $pic_count 1 +2 +2 +1 IntOp $pic_count $pic_count - 1 SetBrandingImage /IMGID=1046 /RESIZETOFIT "$PLUGINSDIR\$pic_count.bmp" FunctionEnd Function GUIINIT GetFunctionAddress $R0 Back ButtonEvent::AddEventHandler /NOUNLOAD 3 $R0 SetOutPath $PLUGINSDIR ;释放图片 File "Sources\*.bmp" SetBrandingImage /IMGID=1046 /RESIZETOFIT "$PLUGINSDIR\1.bmp" ;先出第一张图片 StrCpy $pic_count 1 ;图片序号1 FunctionEnd */ ;--------------------------- ;处理无边框移动 Function onGUICallback ${If} $MSG = ${WM_LBUTTONDOWN} SendMessage $HWNDPARENT ${WM_NCLBUTTONDOWN} ${HTCAPTION} $0 ${EndIf} FunctionEnd ;------------------------ ;------------------------------ Function ExtractFiles InitPluginsDir File /oname=$PLUGINSDIR\index.htm Sources\index.htm File /oname=$PLUGINSDIR\1.jpg Sources\1.jpg File /oname=$PLUGINSDIR\2.jpg Sources\2.jpg File /oname=$PLUGINSDIR\3.jpg Sources\3.jpg File /oname=$PLUGINSDIR\4.jpg Sources\4.jpg FunctionEnd Function CreateStaticRect System::Call `*(i,i,i,i)i(0,24,300,116).R0` System::Call `user32::MapDialogRect(i$HWNDPARENT,iR0)` System::Call `*$R0(i.s,i.s,i.s,i.s)` System::Free $R0 FindWindow $R0 "#32770" "" $HWNDPARENT System::Call `user32::CreateWindowEx(i,t"STATIC",in,i${DEFAULT_STYLES}|${SS_BLACKRECT},is,is,is,is,iR0,i1100,in,in)i.R0` # 轮换图片效果由 HTML 所实现,此处仅适用插件来显示网页。 WebCtrl::ShowWebInCtrl $R0 "$PLUGINSDIR/index.htm" FunctionEnd