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

497 lines
15 KiB
Plaintext
Raw Normal View History

2018-12-18 03:31:20 +00:00
;=========================================================
; teleport-assist Run-time Package Installer Script.
;=========================================================
;--------------------------------------
; 参数检查
;--------------------------------------
;--------------------------------------
; 包含安装对话框所要用到的头文件
;--------------------------------------
!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 "$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_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
;--------------------------------
;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_1
Delete $VAR_TEMP_1
Rename "$R2\$R1" "$VAR_TEMP_1"
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
;添加urlprotocol
WriteRegStr HKCR "${URL_PROTOCOL_NAME}" "" "URL:${URL_PROTOCOL_NAME} Protocol Handler"
WriteRegStr HKCR "${URL_PROTOCOL_NAME}" "URL Protocol" ""
WriteRegStr HKCR "${URL_PROTOCOL_NAME}\DefaultIcon" "" "$INSTDIR\${PFNAME_ASSIST}.exe,0"
WriteRegStr HKCR "${URL_PROTOCOL_NAME}\shell" "" ""
WriteRegStr HKCR "${URL_PROTOCOL_NAME}\shell\open" "" ""
WriteRegStr HKCR "${URL_PROTOCOL_NAME}\shell\open\command" "" '"$INSTDIR\${PFNAME_ASSIST}.exe" -open "%1"'
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}"
;删除urlprotocol注册信息
DeleteRegKey HKCR "${URL_PROTOCOL_NAME}"
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\tp4a\teleport\assist"
;Sleep 1000
;RMDir "$APPDATA\tp4a\teleport"
;Sleep 1000
;RMDir "$APPDATA\tp4a"
SectionEnd
;-------------------------------------------------
; 安装
;-------------------------------------------------
Function InstSoft
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