mirror of https://github.com/tp4a/teleport
509 lines
29 KiB
Plaintext
509 lines
29 KiB
Plaintext
;=========================================================
|
||
; 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
|