我的博客小站

.nsi安装脚本示例

; The Egret Video Converter setup script.
; 注意各种定义的顺序,
;     1. 全局配置
;     2. 然后是页配置
;     3. 插入各种语言 !insertmacro MUI_LANGUAGE
;     4. 定义各种LangString
;     5. 打包保留文件

!include "MUI2.nsh"


############################################################################
############################################################################
#################### 这里放置一些预定义常量 ################################

 !define PACKET_PATH "client"       ; 程序打包目录
 !define PRODUCT_APP "VideoConverter.exe"    ; 可执行文件体
 !define PRODUCT_UNINST "UnInstall.exe"          ; 卸载文件名
 
 !define PRODUCT_VERSION "2.2"       ; 软件的用户可见版本号
 !define PRODUCT_WEB "http://www.egretsoft.com"  ; 网址
 !define PRODUCT_VENDOR "egret"       ; OEM厂商
 
 !define PRODUCT_FILEVERSION "2.2009.815.1"     ; 软件的内部属性编号(4个的)
 !define WRITE_REG_POS "HKEY_LOCAL_MACHINE"    ; 写入注册表的跟(管理员权限)
 
 !define PRODUCT_MAIN_MUTEX "EGRET_CONVERTER_2009"  ; 主软件的锁
 !define PRODUCT_SETUP_MUTEX "EGRET_SETUP_MUTEX"   ; 安装程序的锁,同时只能运行一个安装程序


;-----------------------------------------------------------------------------
; 一些附加资源
 !define RES_PATH "setupres"                     ; 资源目录
 !define SPLASHBMP "splash.bmp"                  ; 闪屏文件
 
#################### 这里放置一些预定义常量 ################################
############################################################################
############################################################################

 

 

 

 

 

############################################################################
############################################################################
########################## 一些全局的配置项 ################################
;------------------------------------------------------
; 使用最大全局压缩
;------------------------------------------------------
SetCompressor /SOLID lzma

;------------------------------------------------------
; 软件名称
;------------------------------------------------------
!ifdef NAME
  Name NAME
!else
  Name "$(ProductName)-${PRODUCT_VERSION}"
!endif

;------------------------------------------------------
; 编译输出文件名称
;------------------------------------------------------
!ifdef OUTFILE
  OutFile "${OUTFILE}"
!else
  OutFile "EgretConverter-${PRODUCT_VERSION}-${PRODUCT_VENDOR}.exe"
!endif

;------------------------------------------------------
; 标题名称
;------------------------------------------------------
!ifdef CAPTION
  Caption "${CAPTION}"
!else
  Caption "$(ProductName) - ${PRODUCT_VERSION} $(StrSetupWizard)"
!endif

;------------------------------------------------------
; 横条文本
;------------------------------------------------------
!ifdef BRANDINGTEXT
  BrandingText "${BRANDINGTEXT}";
!else
  BrandingText " ";
!endif

;------------------------------------------------------
; 默认的安装目录 = program + 产品名
;------------------------------------------------------
InstallDir "$PROGRAMFILES\$(ProductName)"

;------------------------------------------------------
; 默认的注册表放置目标
;------------------------------------------------------ 
;!define PRODUCT_DIR_REGKEY "Software\Microsoft\Windows\CurrentVersion\App Paths\$(ProductName)"
!define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\$(ProductName)"
InstallDirRegKey HKLM "${PRODUCT_UNINST_KEY}" "UninstallString"
;RequestExecutionLevel user

 

;--------------------------------
; 界面样式设置

  !define MUI_HEADERIMAGE   ; 定义为HEADER模式
  !define MUI_ABORTWARNING   ; 点击取消时显示对话框
   
  !define MUI_FINISHPAGE_LINK "${PRODUCT_WEB}"
  !define MUI_FINISHPAGE_LINK_LOCATION "${PRODUCT_WEB}"
  !define MUI_FINISHPAGE_RUN "$INSTDIR\${PRODUCT_APP}"

  !define MUI_ICON "${RES_PATH}\Install-Icon.ico"      ; 安装的图标
  !define MUI_UNICON "${RES_PATH}\UnInstall-Icon.ico"     ; 卸载的图标
  !define MUI_HEADERIMAGE_BITMAP "${RES_PATH}\Install-Header.bmp"   ; 安装的HEADER图像
  !define MUI_HEADERIMAGE_UNBITMAP "${RES_PATH}\Install-Header.bmp"  ; 卸载的HEADER图像


########################## 一些全局的配置项 ################################
############################################################################
############################################################################

 

 


############################################################################
############################################################################
##########################      安装页      ################################

  !insertmacro MUI_PAGE_LICENSE $(myLicenseData) ;"${MY_LICENCE_FILE}"
  !insertmacro MUI_PAGE_DIRECTORY
  !insertmacro MUI_PAGE_INSTFILES
 
 
  !insertmacro MUI_UNPAGE_CONFIRM
  !insertmacro MUI_UNPAGE_INSTFILES
  !insertmacro MUI_PAGE_FINISH

##########################      安装页      ################################
############################################################################
############################################################################

 


 
############################################################################
############################################################################
##########################    语言处理项    ################################

; 加载语言文件
!insertmacro MUI_LANGUAGE "English"
!insertmacro MUI_LANGUAGE "French"
!insertmacro MUI_LANGUAGE "SimpChinese"
!insertmacro MUI_LANGUAGE "TradChinese"
!insertmacro MUI_LANGUAGE "Japanese"

#LoadLanguageFile "${NSISDIR}\Contrib\Language files\English.nlf"
#LoadLanguageFile "${NSISDIR}\Contrib\Language files\French.nlf"
#LoadLanguageFile "${NSISDIR}\Contrib\Language files\TradChinese.nlf"
#LoadLanguageFile "${NSISDIR}\Contrib\Language files\SimpChinese.nlf"
#LoadLanguageFile "${NSISDIR}\Contrib\Language files\Japanese.nlf"

; license 文件
LicenseLangString myLicenseData ${LANG_ENGLISH} "${RES_PATH}\license.txt"
LicenseLangString myLicenseData ${LANG_FRENCH} "${RES_PATH}\license.txt"
LicenseLangString myLicenseData ${LANG_TRADCHINESE} "${RES_PATH}\license-tc.txt"
LicenseLangString myLicenseData ${LANG_SIMPCHINESE} "${RES_PATH}\license-sc.txt"
LicenseLangString myLicenseData ${LANG_JAPANESE} "${RES_PATH}\license.txt"
LicenseData $(myLicenseData)

; 产品名称
LangString ProductName ${LANG_ENGLISH} "Egret Video Converter"
LangString ProductName ${LANG_FRENCH} "Egret Video Converter"
LangString ProductName ${LANG_TRADCHINESE} "白鷺視頻轉換器"
LangString ProductName ${LANG_SIMPCHINESE} "白鹭视频转换器"
LangString ProductName ${LANG_JAPANESE} "Egret Video Converter"

; 官方站点
LangString WebShortName ${LANG_ENGLISH} "Official Site"
LangString WebShortName ${LANG_FRENCH} "Site Officiel"
LangString WebShortName ${LANG_TRADCHINESE} "官方首頁"
LangString WebShortName ${LANG_SIMPCHINESE} "官方站点"
LangString WebShortName ${LANG_JAPANESE} "公式サイト"

; 卸载程序
LangString UninstallName ${LANG_ENGLISH} "Uninstall"
LangString UninstallName ${LANG_FRENCH} "Uninstall"
LangString UninstallName ${LANG_TRADCHINESE} "Uninstall"
LangString UninstallName ${LANG_SIMPCHINESE} "Uninstall"
LangString UninstallName ${LANG_JAPANESE} "Uninstall"


; 白鹭工作室
LangString StrCompanyName ${LANG_ENGLISH} "Bailu Studio"
LangString StrCompanyName ${LANG_FRENCH} "Bailu Studio"
LangString StrCompanyName ${LANG_TRADCHINESE} "白鷺工作室 - Bailu Studio"
LangString StrCompanyName ${LANG_SIMPCHINESE} "白鹭工作室 - Bailu Studio"
LangString StrCompanyName ${LANG_JAPANESE} "Bailu Studio"

; 安装向导
LangString StrSetupWizard ${LANG_ENGLISH} "Setup Wizard"
LangString StrSetupWizard ${LANG_FRENCH} "Assistant"
LangString StrSetupWizard ${LANG_TRADCHINESE} "安裝嚮導"
LangString StrSetupWizard ${LANG_SIMPCHINESE} "安装向导"
LangString StrSetupWizard ${LANG_JAPANESE} "セットアップウィザード"


; 安装程序正在运行中
LangString StrAlreadyHaveOne ${LANG_ENGLISH} "Already exist one instance."
LangString StrAlreadyHaveOne ${LANG_FRENCH} "Il existe déjà un exemple."
LangString StrAlreadyHaveOne ${LANG_TRADCHINESE} "已經有一個安裝程序正在運行中。"
LangString StrAlreadyHaveOne ${LANG_SIMPCHINESE} "已经有一个安装程序正在运行中。"
LangString StrAlreadyHaveOne ${LANG_JAPANESE} "すでに実行中のインストールプログラムです."


; 感谢您的使用
LangString StrUninstallThanks ${LANG_ENGLISH} "Thank you very much! $(ProductName) has been successfully removed."
LangString StrUninstallThanks ${LANG_FRENCH} "Merci pour votre utilisation! $(ProductName) a été  supprié de votre ordinateur."
LangString StrUninstallThanks ${LANG_TRADCHINESE} "非常感謝您的使用! $(ProductName) 已成功從從您的計算機中移除。"
LangString StrUninstallThanks ${LANG_SIMPCHINESE} "非常感謝您的使用! $(ProductName) 已成功地从您的计算机中移除。"
LangString StrUninstallThanks ${LANG_JAPANESE} "本当にありがとうございます! $(ProductName) を正常に削除されています."


; 主程序在运行
LangString StrMainRunning ${LANG_ENGLISH} "System detected you are running $(ProductName). Setup will not be able to continue."
LangString StrMainRunning ${LANG_FRENCH} "Le système a détecté que vous utilisez $(ProductName). Le programme d'installation ne sera pas en mesure de continuer."
LangString StrMainRunning ${LANG_TRADCHINESE} "系統檢測到您正在運行$(ProductName)。安裝程序將無法繼續下去。"
LangString StrMainRunning ${LANG_SIMPCHINESE} "系统检测出您正在运行$(ProductName)。安装程序将不能继续。"
LangString StrMainRunning ${LANG_JAPANESE} "$(ProductName) を実行しているシステムで検出された。セットアップを続行することはできなくなります."

##########################    语言处理项    ################################
############################################################################
############################################################################


;--------------------------------
; 各种保打包保留文件
 
  !insertmacro MUI_RESERVEFILE_LANGDLL
  ReserveFile "${NSISDIR}\Plugins\advsplash.dll"
  ReserveFile "${RES_PATH}\${SPLASHBMP}"


 
############################################################################
############################################################################
###########################  主安装函数 ####################################
Section "MainSection" SEC01
 
  ; 设置输出目录
  SetOutPath "$INSTDIR"
   
  ; 解压缩所有文件
  File /r "${PACKET_PATH}\*.*"
   
  ; 创建反安装程序及反安装注册表项
  WriteUninstaller "$INSTDIR\${PRODUCT_UNINST}"
  WriteRegStr ${WRITE_REG_POS} "${PRODUCT_UNINST_KEY}" "DisplayName" "$(ProductName)"
  WriteRegStr ${WRITE_REG_POS} "${PRODUCT_UNINST_KEY}" "UninstallString" "$INSTDIR\${PRODUCT_UNINST}"
  WriteRegStr ${WRITE_REG_POS} "${PRODUCT_UNINST_KEY}" "DisplayIcon" "$INSTDIR\${PRODUCT_APP}"
  WriteRegStr ${WRITE_REG_POS} "${PRODUCT_UNINST_KEY}" "DisplayVersion" "${PRODUCT_VERSION}"
  WriteRegStr ${WRITE_REG_POS} "${PRODUCT_UNINST_KEY}" "HelpLink" "${PRODUCT_WEB}"
  WriteRegStr ${WRITE_REG_POS} "${PRODUCT_UNINST_KEY}" "Publisher" "$(StrCompanyName)"
  WriteRegStr ${WRITE_REG_POS} "${PRODUCT_UNINST_KEY}" "URLUpdateInfo" "${PRODUCT_WEB}"
  WriteRegStr ${WRITE_REG_POS} "${PRODUCT_UNINST_KEY}" "INSTDIR" "$INSTDIR"

  ; 创建开始菜单(由于隐藏,所以程序组名称定死了)
  CreateDirectory "$SMPROGRAMS\$(ProductName)"
  CreateShortCut "$SMPROGRAMS\$(ProductName)\$(UninstallName).lnk" "$INSTDIR\${PRODUCT_UNINST}"
  CreateShortCut "$SMPROGRAMS\$(ProductName)\$(ProductName).lnk" "$INSTDIR\${PRODUCT_APP}"
  CreateShortCut "$SMPROGRAMS\$(ProductName)\$(WebShortName).lnk" "${PRODUCT_WEB}"

  ; 创建桌面图标
  CreateShortCut "$DESKTOP\$(ProductName).lnk" "$INSTDIR\${PRODUCT_APP}"
 
  ; 创建快捷图标
  CreateShortCut "$QUICKLAUNCH\$(ProductName).lnk" "$INSTDIR\${PRODUCT_APP}"

SectionEnd
###########################  主安装函数 ####################################
############################################################################
############################################################################

 

 

 

 

############################################################################
############################################################################
###########################  入口函数   ####################################
Function .onInit

  ; 检测多实例
  System::Call 'kernel32::CreateMutexA(i 0, i 0, t "${PRODUCT_SETUP_MUTEX}" ) i .r1 ?e'
  Pop $R0
  StrCmp $R0 0 +3
  MessageBox MB_OK|MB_ICONEXCLAMATION "$(StrAlreadyHaveOne)"
  Abort
 
  ; 闪屏
  InitPluginsDir
  File "/oname=$PLUGINSDIR\Splash_splash.bmp" "${RES_PATH}\${SPLASHBMP}"
  advsplash::show 1000 600 400 0xFF00FF "$PLUGINSDIR\Splash_splash"     ; 使用闪屏插件显示闪屏
  Pop $0 ; $0 返回 '1' 表示用户提前关闭闪屏, 返回 '0' 表示闪屏正常结束, 返回 '-1' 表示闪屏显示出错

 

  !insertmacro MUI_LANGDLL_DISPLAY  ; 首先显示语言页,因为里面有跳转,所以必须放到函数中
 
FunctionEnd
###########################  入口函数   ####################################
############################################################################
############################################################################

 

 

 

 


############################################################################
############################################################################
###########################  卸载函数   ####################################


Section "Uninstall"

  # 删除安装目录
  RMDir /r "$INSTDIR"
   
  # 删除开始/程序项
  RMDir /r "$SMPROGRAMS\$(ProductName)"
 
  # 删除添加/删除列表选项
  DeleteRegKey ${WRITE_REG_POS} "${PRODUCT_UNINST_KEY}"
  ;DeleteRegKey HKLM "${PRODUCT_DIR_REGKEY}"

  ; 删除桌面图标(要删除所有语言的名称,以防有问题。尽量不要让用户手动去删除)
  Delete "$DESKTOP\$(ProductName).lnk"
  Delete "$DESKTOP\Egret Video Converter.lnk"
 
  ; 删除快捷图标
  Delete "$QUICKLAUNCH\$(ProductName).lnk"
  Delete "$QUICKLAUNCH\Egret Video Converter.lnk"

  ; 界面自动关闭
  SetAutoClose true
 
SectionEnd


Function un.onInit

  ; 检测主程序是否在运行中,在运行中不能继续
  System::Call 'kernel32::CreateMutexA(i 0, i 0, t "${PRODUCT_MAIN_MUTEX}" ) i .r1 ?e'
  Pop $R0
  StrCmp $R0 0 +3
  MessageBox MB_OK|MB_ICONEXCLAMATION "$(StrMainRunning)"
  Abort

  ; 似乎有一个BUG,那就是必须要关闭这个mutex。否则没有办法卸载,真正的HANDLE存储在$1中
  ; 这个BUG不仅仅影响卸载不能继续,另一个问题就是在完成的时候打开程序运行,也会出现错误的!
  System::Call 'kernel32::CloseHandle(i "$1" )'
 
  ; 提示用户一下,万一点错了等情况
 ; MessageBox MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2 "$(STR_UNINSTALL_CONFIRM)" IDYES +2
 ; Abort

  ; 语言切换
  ;!insertmacro MUI_UNGETLANGUAGE

FunctionEnd

Function un.onUninstSuccess
  ; 提示
  MessageBox MB_ICONINFORMATION|MB_OK "$(StrUninstallThanks)"
FunctionEnd

###########################  卸载函数   ####################################
############################################################################
############################################################################

posted on 2011-09-16 13:19  BIGSING  阅读(1153)  评论(0编辑  收藏  举报

导航

我的博客小站