iniwf

风是温柔的,雨是伤心的,云是快乐的,月是多情的,爱是迷失的,恋是醉人的,情是难忘的,天是长久的,地是永恒的

提供修复界面的NSIS安装包

; 该脚本由邦畿千里制作,可自由传播使用 QQ:911377

!include "LogicLib.nsh"

; 安装背景及文字
!define PRODUCT_TEXT_KEY "(邦畿千里)"
!define PRODUCT_TEXT_BACK "resource\back.bmp"
!define PRODUCT_TEXT_PROXCY "现无偿提供给NSIS爱好者使用!"
!define PRODUCT_TEXT_TEL "QQ:911137"
!define PRODUCT_TEXT_AREA "1.自动监测,修复,安装,删除!"
!define PRODUCT_TEXT_INTRUDUCE "2.自由替换图片、背景,注册动态库,执行Exe多种功能!"


; 安装程序初始定义常量
!define PRODUCT_PATH "邦畿千里系列软件"
!define PRODUCT_NAME "邦畿千里画图软件"
!define PRODUCT_MAINEXE "mspaint.exe"
!define PRODUCT_VERSION "2008"
!define PRODUCT_PUBLISHER "邦畿千里"
!define PRODUCT_WEB_SITE "http://www.baidu.com"
!define PRODUCT_REGRUN "Software\Microsoft\Windows\CurrentVersion\Run"
!define PRODUCT_DIR_REGKEY "Software\Microsoft\Windows\CurrentVersion\App Paths\${PRODUCT_PUBLISHER}\${PRODUCT_NAME}"
!define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_TEXT_KEY}${PRODUCT_NAME}"
!define PRODUCT_UNINST_ROOT_KEY "HKLM"

SetCompressor lzma

------ MUI 现代界面定义 (1.67 版本以上兼容) ------
!include "MUI.nsh"

; MUI 预定义常量
;
--------------------------------
;Interface Configuration
!define MUI_ABORTWARNING
;安装图标
!define MUI_ICON "resource\install.ico"
;卸载图标
!define MUI_UNICON "resource\uninstall.ico"
;上部图片
!define MUI_HEADERIMAGE
!define MUI_HEADERIMAGE_BITMAP "resource\header.bmp"
;左侧图片
!define MUI_WELCOMEFINISHPAGE_BITMAP "resource\left.bmp"
!define MUI_WELCOMEFINISHPAGE_BITMAP_NOSTRETCH
!define MUI_UNWELCOMEFINISHPAGE_BITMAP "resource\left.bmp"
!define MUI_UNWELCOMEFINISHPAGE_BITMAP_NOSTRETCH
;页面加载之前进行初始化
!define MUI_CUSTOMFUNCTION_GUIINIT ".onGUIBegin"

;
-------------修复页面变量定义-----------------------
!include nsDialogs.nsh
Var UninstallFileName
Var RADIO_REPAIR
Var RADIO_REMOVE
Var Checkbox_State_REPAIR
Var Checkbox_State_REMOVE
Var Checkbox_State

;
-------------页面定义---------------------------
; 欢迎页面
!insertmacro MUI_PAGE_WELCOME
; 修复页面
Page custom nsDialogsRepair nsDialogsRepairLeave
; 许可协议页面
!insertmacro MUI_PAGE_LICENSE "resource\licence.txt"
; 安装目录选择页面
!insertmacro MUI_PAGE_DIRECTORY
; 安装过程页面
!insertmacro MUI_PAGE_INSTFILES
; 安转完成后自动运行文件
!define MUI_FINISHPAGE_RUN "$INSTDIR\${PRODUCT_MAINEXE}"
; 安装完成页面
!insertmacro MUI_PAGE_FINISH
; 安装卸载确认页面
!insertmacro MUI_UNPAGE_CONFIRM
; 安装卸载过程页面
!insertmacro MUI_UNPAGE_INSTFILES
; 安装卸载完成页面
!insertmacro MUI_UNPAGE_FINISH
; 安装预释放文件
!insertmacro MUI_RESERVEFILE_INSTALLOPTIONS
; 安装界面包含的语言设置
!insertmacro MUI_LANGUAGE "SimpChinese"
------ MUI 现代界面定义结束 ------

Name 
"${PRODUCT_NAME} ${PRODUCT_VERSION}"
OutFile 
"${PRODUCT_NAME} ${PRODUCT_VERSION}.exe"
InstallDir 
"$PROGRAMFILES\${PRODUCT_PATH}\${PRODUCT_NAME}"
InstallDirRegKey HKLM 
"${PRODUCT_UNINST_KEY}" "UninstallString"
ShowInstDetails hide
ShowUnInstDetails hide
BrandingText ${PRODUCT_PUBLISHER}

; 激活安装日志记录,该日志文件将会作为卸载文件的依据(注意,本区段必须放置在所有区段之前)
Section 
"-LogSetOn"
  LogSet on
SectionEnd

Section 
"!主程序" SEC01
  SectionIn RO
  SetOutPath 
"$INSTDIR"
  SetOverwrite ifnewer
  CreateDirectory 
"$SMPROGRAMS\${PRODUCT_PATH}\${PRODUCT_NAME}"
  ; 创建开始菜单快捷方式
  CreateShortCut 
"$SMPROGRAMS\${PRODUCT_PATH}\${PRODUCT_NAME}\${PRODUCT_NAME}.lnk" "$INSTDIR\${PRODUCT_MAINEXE}"
  ; 创建桌面快捷方式
  CreateShortCut 
"$DESKTOP\${PRODUCT_NAME}.lnk" "$INSTDIR\${PRODUCT_MAINEXE}"
  File 
"Program\Main\mspaint.exe"
SectionEnd

Section 
"-系统文件" SEC02
  SectionIn RO
  ; 关闭日志,以保证不被卸载掉,主要用于公用文件
  LogSet off
  SetOutPath 
"$SYSDIR"
  SetOverwrite ifnewer
  File 
"Program\System\midas.dll"
  ; 注册动态库
  regdll 
$SYSDIR\midas.dll
  LogSet on
SectionEnd

/******************************
 
*  创建卸载快捷方式  *
 
******************************/
Section 
-AdditionalIcons
  ; 创建开始菜单卸载快捷方式
  CreateShortCut 
"$SMPROGRAMS\${PRODUCT_PATH}\${PRODUCT_NAME}\Uninstall.lnk" "$INSTDIR\uninst.exe"
SectionEnd

/******************************
 
*  写注册表  *
 
******************************/
Section 
-Post
  WriteUninstaller 
"$INSTDIR\uninst.exe"
  ; 系统启动自动运行软件
  WriteRegStr HKLM 
"${PRODUCT_REGRUN}" "${PRODUCT_NAME}" "$INSTDIR\${PRODUCT_MAINEXE}"
  WriteRegStr HKLM 
"${PRODUCT_DIR_REGKEY}" "" "$INSTDIR\${PRODUCT_MAINEXE}"
  WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} 
"${PRODUCT_UNINST_KEY}" "DisplayName" "$(^Name)"
  WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} 
"${PRODUCT_UNINST_KEY}" "UninstallString" "$INSTDIR\uninst.exe"
  WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} 
"${PRODUCT_UNINST_KEY}" "DisplayIcon" "$INSTDIR\${PRODUCT_MAINEXE}"
  WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} 
"${PRODUCT_UNINST_KEY}" "DisplayVersion" "${PRODUCT_VERSION}"
  WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} 
"${PRODUCT_UNINST_KEY}" "URLInfoAbout" "${PRODUCT_WEB_SITE}"
  WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} 
"${PRODUCT_UNINST_KEY}" "Publisher" "${PRODUCT_PUBLISHER}"
SectionEnd

/******************************
 
*  以下是安装程序的初始和结束部分  *
 
******************************/
 
; 页面加载之前进行初始化
Function 
.onInit
  ReadRegStr 
$UninstallFileName ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "UninstallString"
FunctionEnd

; 启动背景
Function 
.onGUIBegin
  BgImage
::SetBg /NOUNLOAD /FILLSCREEN ${PRODUCT_TEXT_BACK}
  CreateFont 
$R0 "Comic Sans MS" 30 400
  BgImage
::AddText /NOUNLOAD "${PRODUCT_NAME}" $R0 0 0 255 48 18 798 198

  CreateFont 
$R3 "Comic Sans MS" 10 100
  BgImage
::AddText /NOUNLOAD ${PRODUCT_TEXT_AREA} $R3 0 0 255 88 78 798 198
  CreateFont 
$R4 "Comic Sans MS" 10 100
  BgImage
::AddText /NOUNLOAD ${PRODUCT_TEXT_INTRUDUCE} $R4 0 0 255 88 98 798 198

  CreateFont 
$R1 "Comic Sans MS" 20 200
  BgImage
::AddText /NOUNLOAD ${PRODUCT_TEXT_PROXCY} $R1 0 0 255 68 118 798 198
  CreateFont 
$R2 "Comic Sans MS" 20 200
  BgImage
::AddText /NOUNLOAD ${PRODUCT_TEXT_TEL} $R2 0 0 255 68 158 798 198

  BgImage
::Redraw /NOUNLOAD
FunctionEnd

; 销毁启动背景
Function 
.onGUIEnd
  BgImage
::Destroy
FunctionEnd

/******************************
 
*  以下是安装程序的卸载部分  *
 
******************************/

; 根据安装日志卸载文件的调用宏
!macro DelFileByLog LogFile
  ifFileExists `${LogFile}` 
0 +4
    
Push `${LogFile}`
    Call un
.DelFileByLog
    
Delete `${LogFile}`
!macroend

Section Uninstall

  ; 调用宏只根据安装日志卸载安装程序自己安装过的文件
  
!insertmacro DelFileByLog "$INSTDIR\install.log"

  ; 清除安装程序创建的且在卸载时可能为空的子目录,对于递归添加的文件目录,请由最内层的子目录开始清除(注意,不要带 
/r 参数,否则会失去 DelFileByLog 的意义)
  
RMDir "$SMPROGRAMS\${PRODUCT_PATH}\${PRODUCT_NAME}"
  
RMDir "$SMPROGRAMS\${PRODUCT_PATH}"

  
RMDir "$INSTDIR"

  DeleteRegValue HKLM 
"${PRODUCT_REGRUN}" "${PRODUCT_NAME}"
  DeleteRegKey ${PRODUCT_UNINST_ROOT_KEY} 
"${PRODUCT_UNINST_KEY}"
  DeleteRegKey HKLM 
"${PRODUCT_DIR_REGKEY}"
  SetAutoClose true
SectionEnd

#-- 根据 NSIS 脚本编辑规则,所有 Function 区段必须放置在 Section 区段之后编写,以避免安装程序出现未可预知的问题。--#

; 以下是卸载程序通过安装日志卸载文件的专用函数,请不要随意修改
Function un
.DelFileByLog
  Exch 
$R0
  
Push $R1
  
Push $R2
  
Push $R3
  FileOpen 
$R0 $R0 r
  ${
Do}
    FileRead 
$R0 $R1
    ${IfThen} 
$R1 == `` ${|} ${ExitDo} ${|}
    StrCpy 
$R1 $R1 -2
    StrCpy 
$R2 $R1 11
    StrCpy 
$R3 $R1 20
    ${
If$R2 == "File: wrote"
    ${OrIf} 
$R2 == "File: skipp"
    ${OrIf} 
$R3 == "CreateShortCut: out:"
    ${OrIf} 
$R3 == "created uninstaller:"
      
Push $R1
      
Push `"`
      Call un.DelFileByLog.StrLoc
      Pop $R2
      ${If} $R2 != 
""
        IntOp $R2 $R2 + 1
        StrCpy $R3 $R1 
"" $R2
        Push $R3
        Push `
"`
        Call un
.DelFileByLog.StrLoc
        
Pop $R2
        ${
If$R2 != ""
          StrCpy 
$R3 $R3 $R2
          
Delete /REBOOTOK $R3
        ${EndIf}
      ${EndIf}
    ${EndIf}
    StrCpy 
$R2 $R1 7
    ${
If$R2 == "Rename:"
      
Push $R1
      
Push "->"
      Call un
.DelFileByLog.StrLoc
      
Pop $R2
      ${
If$R2 != ""
        IntOp 
$R2 $R2 + 2
        StrCpy 
$R3 $R1 "" $R2
        
Delete /REBOOTOK $R3
      ${EndIf}
    ${EndIf}
  ${Loop}
  FileClose 
$R0
  
Pop $R3
  
Pop $R2
  
Pop $R1
  
Pop $R0
FunctionEnd

Function un
.DelFileByLog.StrLoc
  Exch 
$R0
  Exch
  Exch 
$R1
  
Push $R2
  
Push $R3
  
Push $R4
  
Push $R5
  StrLen 
$R2 $R0
  StrLen 
$R3 $R1
  StrCpy 
$R4 0
  ${
Do}
    StrCpy 
$R5 $R1 $R2 $R4
    ${
If$R5 == $R0
    ${OrIf} 
$R4 = $R3
      ${ExitDo}
    ${EndIf}
    IntOp 
$R4 $R4 + 1
  ${Loop}
  ${
If$R4 = $R3
    StrCpy 
$R0 ""
  ${
Else}
    StrCpy 
$R0 $R4
  ${EndIf}
  
Pop $R5
  
Pop $R4
  
Pop $R3
  
Pop $R2
  
Pop $R1
  Exch 
$R0
FunctionEnd

/******************************
 
*  以下是安装程序的修复部分  *
 
******************************/
 
Function nsDialogsRepairLeave
  ${NSD_GetState} 
$RADIO_REPAIR $Checkbox_State_REPAIR
  ${NSD_GetState} 
$RADIO_REMOVE $Checkbox_State_REMOVE
  ${
If$Checkbox_State_REMOVE == ${BST_CHECKED}
    
Exec $UninstallFileName
    Quit
  ${EndIf}
FunctionEnd

Function nsDialogsRepair
  ${
if$UninstallFileName == ""
    Abort
  ${EndIf}
  
!insertmacro MUI_HEADER_TEXT "已经安装" "选择您要执行的操作"

    nsDialogs
::Create /NOUNLOAD 1018

  ${NSD_CreateLabel} 10u 0u 300u 30u 
"软件已经安装,请选择您要执行的操作,并点击『下一步(N)』继续"

    ${NSD_CreateRadioButton}  40u 30u 100u 30u 
"修复或重新安装"
    
Pop $RADIO_REPAIR
    ${
If$Checkbox_State_REPAIR == ${BST_CHECKED}
        ${NSD_Check} 
$RADIO_REPAIR
        ${NSD_GetState} 
$RADIO_REPAIR $Checkbox_State
    ${EndIf}

  ${NSD_CreateRadioButton}  40u 60u 100u 30u 
"卸载"
  
Pop $RADIO_REMOVE
    ${
If$Checkbox_State_REMOVE == ${BST_CHECKED}
        ${NSD_Check} 
$RADIO_REMOVE
        ${NSD_GetState} 
$RADIO_REMOVE $Checkbox_State
    ${EndIf}

  ${
If$Checkbox_State <> ${BST_CHECKED}
    ${NSD_Check} 
$RADIO_REPAIR
  ${EndIf}
    nsDialogs
::Show
FunctionEnd

posted on 2009-05-08 08:59 iniwf 阅读(1393) 评论(0)  编辑 收藏 引用 所属分类: 软件打包


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


导航

统计

常用链接

留言簿(2)

随笔分类

随笔档案

收藏夹

IT技术

积分与排名

最新评论

阅读排行榜

评论排行榜