teleport/dist/client/windows/assist/setup.nsh

509 lines
29 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

;=========================================================
; teleport-assist Run-time Package Installer Script.
;=========================================================
;--------------------------------------
; 命令行参数检查
;--------------------------------------
;!ifndef OEM_NAME
; !error "You must define OEM_NAME."
;!endif
;--------------------------------------
; 包含安装对话框所要用到的头文件
;--------------------------------------
!include "MUI.nsh"
!include "x64.nsh"
!include "WinVer.nsh"
!include "WordFunc.nsh"
!include "FileFunc.nsh"
;--------------------------------------
; 定义编译nsi脚本的输出文件名称
;--------------------------------------
OutFile "..\..\..\..\out\installer\${FILE_NAME_RUNTIMEPAGE}"
Name "$(STR_PRODUCT_NAME_DISPLAY)"
;--------------------------------------
; 定义安装程序的版本信息[可选]
;--------------------------------------
VIProductVersion ${FILE_VER}
VIAddVersionKey "CompanyName" "${COMPANY_NAME}"
VIAddVersionKey "ProductName" "${PRODUCT_NAME_DISPLAY}"
VIAddVersionKey "FileDescription" "${PRODUCT_DESC}"
VIAddVersionKey "LegalCopyright" "${COPYRIGHT}"
VIAddVersionKey "FileVersion" "${FILE_VER}"
VIAddVersionKey "ProductVersion" "${FILE_VER}"
;--------------------------------------
; 定义默认安装路径
;--------------------------------------
;InstallDir "$PROGRAMFILES\${TARGET_DIR_BASE}"
InstallDir "$APPDATA\${TARGET_DIR_BASE}"
;--------------------------------------
; 定义默认注册表键值
;--------------------------------------
InstallDirRegKey HKLM "${TARGET_REG_BASE}" ""
;--------------------------------------
; 设置安装和卸载对话框的资源
;--------------------------------------
!define MUI_UNICON "${SRC_RC_PATH}\uninstall.ico"
!define MUI_ICON "${SRC_RC_PATH}\install.ico"
!define MUI_WELCOMEFINISHPAGE_BITMAP "${SRC_RC_PATH}\win_inst.bmp"
!define MUI_UNWELCOMEFINISHPAGE_BITMAP "${SRC_RC_PATH}\win_uninst.bmp"
!define MUI_HEADERIMAGE ; Use the header image
!define MUI_HEADERIMAGE_RIGHT ; Put the header image to right.
!define MUI_HEADERIMAGE_BITMAP "${SRC_RC_PATH}\header_inst.bmp"
!define MUI_HEADERIMAGE_UNBITMAP "${SRC_RC_PATH}\header_uninst.bmp"
;--------------------------------------
; 安装和卸载的过程详细信息显示开关
;--------------------------------------
ShowInstDetails "nevershow"
ShowUninstDetails "nevershow"
;--------------------------------------
;要求安装安装时候使用管理员权限
;--------------------------------------
RequestExecutionLevel admin
;--------------------------------------
;安装和卸载退出前警告
;--------------------------------------
!define MUI_ABORTWARNING
!define MUI_UNABORTWARNING
;记住安装程序选用的语言,将来在卸载程序中可能用到
!define MUI_LANGDLL_REGISTRY_ROOT "HKLM"
!define MUI_LANGDLL_REGISTRY_KEY "${TARGET_REG_BASE}"
!define MUI_LANGDLL_REGISTRY_VALUENAME "InstallLanguageId"
!define MUI_COMPONENTSPAGE_SMALLDESC
;--------------------------------
;声明一些变量
;--------------------------------
;Var VAR_TEMP_PATH ;;资源释放的临时目录
Var VAR_TEMP_SYSWOW64 ;; 64位系统 的syswow64, 32位系统的system32
Var VAR_TEMP_0
Var VAR_TEMP_1
Var VAR_TEMP_2
;--------------------------------------
; 定义安装对话框
;--------------------------------------
; Installer Pages.
!insertmacro MUI_PAGE_WELCOME
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_PAGE_FINISH
;--------------------------------------
; 定义卸载对话框
;--------------------------------------
!insertmacro MUI_UNPAGE_WELCOME
!insertmacro MUI_UNPAGE_INSTFILES
!insertmacro MUI_UNPAGE_FINISH
;--------------------------------------
; 多语言支持
;--------------------------------------
!ifdef _SUPPORT_LANG_SIMPCHINESE
!include "LangSimpChinese.nsh"
!ifndef _SUPPORT_MUTI_LANGS_
!define _LANG 2052
!define _LANG_NAME "SimpChinese"
!endif ;;
!endif
!ifdef _SUPPORT_LANG_ENGLISH
!include "LangEnglish.nsh"
!ifndef _SUPPORT_MUTI_LANGS_
!define _LANG 1033
!define _LANG_NAME "English"
!endif ;;
!endif
!ifdef _SUPPORT_LANG_TRADCHINESE
!include "LangTradChinese.nsh"
!ifndef _SUPPORT_MUTI_LANGS_
!define _LANG 1028
!define _LANG_NAME "TradChinese"
!endif ;;
!endif
!ifdef _SUPPORT_LANG_JAPANESE
!include "LangJapanese.nsh"
!ifndef _SUPPORT_MUTI_LANGS_
!define _LANG 1041
!define _LANG_NAME "Japanese"
!endif ;;
!endif
;--------------------------------
;Reserve Files
;These files should be inserted before other files in the data block
;Keep these lines before any File command
;Only for BZIP2 (solid) compression
ReserveFile "${SRC_RC_PATH}\header_inst.bmp"
!ifdef _SUPPORT_MUTI_LANGS_
!insertmacro MUI_RESERVEFILE_LANGDLL ;LangDLL (language selection dialog)
!endif
;-------------------------------------------------
; 拷贝并安装文件,如果存在则重命名
; $R0 -- 源目录
; $R1 -- 源文件名
; $R2 -- 目标目录
;-------------------------------------------------
;Function CopyAndReplaceFile
; ;MessageBox MB_OK "1:$R0\$R1, 2:$R2"
; SetOverwrite try
; ClearErrors
; CopyFiles /SILENT "$R0\$R1" "$R2"
; IfErrors 0 NO_ERROR
; IfFileExists "$R2\$R1" 0 NO_ERROR
; GetTempFileName $VAR_TEMP_1
; ;MessageBox MB_OK "R0\R1:$R0\$R1 R2:$R2"
; Delete "$VAR_TEMP_1"
; Rename "$R2\$R1" "$VAR_TEMP_1"
; CopyFiles /SILENT "$R0\$R1" "$R2"
; ;
; IfErrors 0 NO_ERROR
; ;MessageBox MB_OK "CopyFiles err"
; Rename "$R0\$R1" "$R2\$R1"
;NO_ERROR:
; Return
;FunctionEnd
Function un.CheckAndRenameFile
IfFileExists "$R2\$R1" 0 NO_ERROR
GetTempFileName $VAR_TEMP_2
Delete $VAR_TEMP_2
Rename "$R2\$R1" "$VAR_TEMP_2"
NO_ERROR:
Return
FunctionEnd
;--------------------------------
; 安装初始化
;--------------------------------
Function .onInit
SetOverwrite try
;----------------------------------------------------------------
; 只有一个运行实例
;----------------------------------------------------------------
System::Call 'kernel32::CreateMutexA(i 0, i 0, t "${PRODUCT_GUID}_InstallMutex") i .r1 ?e'
Pop $R0
StrCmp $R0 0 +3
MessageBox MB_OK|MB_ICONEXCLAMATION $(STR_CHECK_MUTEX) /SD IDOK
Abort
StrCpy $0 "$SYSDIR"
${If} ${RunningX64}
System::Call "kernel32::GetSystemWow64Directory(t .r0, i ${NSIS_MAX_STRLEN})"
${EndIf}
StrCpy $VAR_TEMP_SYSWOW64 $0
;----------------------------------------------------------------
; 检查是否需要重新启动计算机
;----------------------------------------------------------------
;----------------------------------------------------------------
; 检查是否是管理员操作的
; 安装时要检查是否为管理员权限
;----------------------------------------------------------------
ClearErrors
UserInfo::GetName
IfErrors OnWin9X
goto OnInitOk
; Pop $0
; UserInfo::GetAccountType
; Pop $1
; StrCmp $1 "Admin" OnInitOk OnInitErr
;----------------------------------------------------------------
;;调试日志
;;MessageBox MB_OK "test onInit11"
;----------------------------------------------------------------
OnInitErr:
MessageBox MB_OK $(STR_CHECK_ADMIN) /SD IDOK
Abort
OnWin9X:
Abort
; We create shortcuts to All users not Current User
OnInitOk:
;SetShellVarContext all
;Abort
;------------------------------------
; 检查操作系统版本
; 支持的最低操作系统是win2000
;------------------------------------
${If} ${AtLeastWin2000}
${Else}
MessageBox MB_OK $(STR_CHECK_OSVER) /SD IDOK
Abort
${EndIf}
;------------------------------------
; 检测旧版本
; 调用旧版本的卸载程序卸载旧版本,并且提示用户安装新版本
;------------------------------------
;读取版本号,失败-没有安装过。 成功比较版本
ClearErrors
ReadRegStr $R0 HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_GUID}" "Version"
StrCmp $R0 "" Label_NotInstalled +1
StrCpy $R1 "${FILE_VER}"
;读取卸载字符串,如果不存在,说明安装的不全
ReadRegStr $VAR_TEMP_0 HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_GUID}" "UninstallString"
StrCmp $VAR_TEMP_0 "" +1 Label_Isinstalled
goto Label_NotInstalled
Label_Isinstalled:
;比较版本,如果判断需要升级,提示用户卸载旧版本
;相等则提示是否卸载,已经安装更新的产品提示“已经安装”
;VersionCompareUage:0(=),1(>),2(<)
;;${VersionCompare} "[Version1]" "[Version2]" $var
;;"[Version1]" ; First version
;;"[Version2]" ; Second version
;;$var ; Result:
;; ; $var=0 Versions are equal
;; ; $var=1 Version1(installed) is newer
;; ; $var=2 Version2(current setup) is newer
${VersionCompare} $R0 $R1 $R2
;;;IntCmp val1 val2 jump_if_equal [jump_if_val1_less] [jump_if_val1_more]:( =, < , >)
IntCmp $R2 1 Label_NewVerInstalled Label_EquVerInstalled Label_OldVerInstalled
Label_OldVerInstalled:
MessageBox MB_YESNO|MB_ICONQUESTION $(STR_CHECK_OLDVER) /SD IDOK IDNO label_AbortInstall
Exec $VAR_TEMP_0
goto label_AbortInstall
Label_EquVerInstalled:
MessageBox MB_YESNO|MB_ICONQUESTION $(STR_CHECK_EQUVER) /SD IDNO IDNO label_AbortInstall
Exec $VAR_TEMP_0
goto label_AbortInstall
Label_NewVerInstalled:
goto label_AbortInstall
Label_AbortInstall:
abort
Label_NotInstalled:
FunctionEnd
;=================================================================
; 安装:
;=================================================================
Section
ClearErrors
CreateDirectory "$INSTDIR"
WriteUninstaller "$INSTDIR\uninst.exe"
WriteRegStr HKLM "${TARGET_REG_BASE}" "Path" $INSTDIR
WriteRegStr HKLM "${TARGET_REG_BASE}" "Version" ${FILE_VER}
WriteRegStr HKLM "${TARGET_REG_BASE}" "${MUI_LANGDLL_REGISTRY_VALUENAME}" $LANGUAGE
Call InstSoft
; uninstall strings
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_GUID}" "DisplayName" $(STR_UNINSTALL_DISPLAY_NAME)
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_GUID}" "UninstallString" '"$INSTDIR\uninst.exe"'
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_GUID}" "Publisher" ${COMPANY_NAME}
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_GUID}" "URLInfoAbout" ${PRODUCT_WEBSITE}
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_GUID}" "DisplayIcon" '"$INSTDIR\${PFNAME_ASSIST}.exe"'
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_GUID}" "DisplayVersion" ${FILE_VER}
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_GUID}" "Version" ${FILE_VER}
WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_GUID}" "NoModify" 0x00000001
SectionEnd
;--------------------------------
; 卸载初始化
;--------------------------------
Function un.onInit
ReadRegStr $LANGUAGE HKLM "${TARGET_REG_BASE}" "InstallLanguageId"
;----------------------------------------------------------------
; 只有一个运行实例
;----------------------------------------------------------------
!ifdef UNINSTALL_COMPONENTS
MessageBox MB_YESNO|MB_ICONQUESTION $(un.STR_UNINSTALL_COMPONENTS) IDYES true IDNO false
false:
Abort
true:
!endif
System::Call 'kernel32::CreateMutexA(i 0, i 0, t "${PRODUCT_GUID}_UninstallMutex") i .r1 ?e'
Pop $R0
StrCmp $R0 0 +3
MessageBox MB_OK|MB_ICONEXCLAMATION $(un.STR_CHECK_MUTEX)
Abort
StrCpy $0 "$SYSDIR"
${If} ${RunningX64}
System::Call "kernel32::GetSystemWow64Directory(t .r0, i ${NSIS_MAX_STRLEN})"
${EndIf}
StrCpy $VAR_TEMP_SYSWOW64 $0
Push $R0
Push $R1
ReadRegStr $R0 HKLM "SOFTWARE\Microsoft\Windows NT\CurrentVersion" CurrentVersion
;----------------------------------------------------------------
; 检查是否是管理员操作的
;----------------------------------------------------------------
ClearErrors
UserInfo::GetName
IfErrors OnWin9X
Pop $0
UserInfo::GetAccountType
Pop $1
StrCmp $1 "Admin" OnInitOk OnInitErr
OnInitErr:
MessageBox MB_OK $(un.STR_CHECK_ADMIN)
Abort
OnWin9X:
;Abort
; We create shortcuts to All users not Current User
OnInitOk:
;SetShellVarContext all
;Abort
FunctionEnd
;=================================================================
; 卸载:
;=================================================================
Section "Uninstall"
;------------------------------------
; 1: 卸载
;------------------------------------
SetOutPath $TEMP
Call un.InstSoft
;------------------------------------
; 2: 删除注册表及目录
;删除注册表先删除本产品的子节点TARGET_REG_BASE然后尝试删除空的根节点TARGET_REG_ROOT
;------------------------------------
DeleteRegKey HKLM "${TARGET_REG_BASE}"
DeleteRegKey /ifempty HKLM "${TARGET_REG_ROOT}"
DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_GUID}"
Delete "$INSTDIR\uninst.exe"
Sleep 1000
; Loop to remove the $INSTDIR.
RMDir /r $INSTDIR
Sleep 1000
GetFullPathName $VAR_TEMP_0 "$INSTDIR\.."
RMDir $VAR_TEMP_0
;Sleep 1000
;RMDir /r "$APPDATA\eomsoft\teleport\assist"
;Sleep 1000
;RMDir "$APPDATA\eomsoft\teleport"
;Sleep 1000
;RMDir "$APPDATA\eomsoft"
SectionEnd
;-------------------------------------------------
; 安装
;-------------------------------------------------
Function InstSoft
;SetOutPath "$APPDATA\eomsoft\teleport\assist\cfg"
;File /r ${SRC_CFG_PATH}\*
SetOutPath "$INSTDIR"
File /r ${SRC_APPS_PATH}\*
;Create shortcuts
CreateShortCut "$DESKTOP\$(STR_DESKTOP_LINK_ASSIST).lnk" "$INSTDIR\${PFNAME_ASSIST}.exe"
CreateDirectory "${START_MENU_ROOT}"
Sleep 1000
CreateDirectory "${START_MENU_BASE}"
CreateShortCut "${START_MENU_BASE}\$(STR_STARTMENU_LINK_ASSIST).lnk" "$INSTDIR\${PFNAME_ASSIST}.exe"
CreateShortCut "${START_MENU_BASE}\$(STR_LINK_UNINSTALLER).lnk" "$INSTDIR\uninst.exe"
${If} ${RunningX64}
SetRegView 64
${EndIf}
; 不要判断此处的返回值,可能无写入权限(即使是管理员身份运行)。
WriteRegStr HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Run" "${PRODUCT_NAME_DESC}" "$\"$INSTDIR\${PFNAME_ASSIST}.exe$\""
${If} ${RunningX64}
SetRegView 32
${EndIf}
; start the assist.
Exec "$INSTDIR\${PFNAME_ASSIST}.exe"
FunctionEnd
;-------------------------------------------------
; 卸载
;-------------------------------------------------
Function un.InstSoft
ExecWait "$INSTDIR\${PFNAME_ASSIST}.exe --stop"
;;尝试删除,失败则修改名称删除
Sleep 2000
ClearErrors
Delete "$INSTDIR\${PFNAME_ASSIST}.exe"
Sleep 100
IfErrors 0 ON_ERROR_DEL_ASSIST
StrCpy $R2 $INSTDIR
StrCpy $R1 "${PFNAME_ASSIST}.exe"
Call un.CheckAndRenameFile
ON_ERROR_DEL_ASSIST:
ClearErrors
DeleteRegValue HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Run\" "${PRODUCT_NAME_DESC}"
Delete "${START_MENU_BASE}\$(STR_LINK_UNINSTALLER).lnk"
Delete "${START_MENU_BASE}\$(STR_STARTMENU_LINK_ASSIST).lnk"
Delete "$DESKTOP\$(STR_DESKTOP_LINK_ASSIST).lnk"
Sleep 1000
RMDir /r "${START_MENU_BASE}"
Sleep 1000
RMDir "${START_MENU_ROOT}"
FunctionEnd
;EOF