NSIS制作了一个完整的演示产品安装程序

NSIS制作了一个完整的演示产品安装程序,实现功能概要如下:
1.安装路径的选择
2.浏览器的选择
3.桌面数据库的自动安装及启动

4.数据库实例及演示数据的自动恢复
5.应用服务器的自动安装
6.JDK的安装及环境变量的设置
7.应用程序的自动安装
8.数据库实例端口的设置(要考虑用户机器上可能存在别的sqlserver数据库实例)
9.windows服务中的自动启动项的安装
10.启动应用
11.readme的打开
 12.用浏览器打开应用的登录界面
 13.在安装过程中切换公司或应用的介绍信息;
 14.自动卸载等

 

还存在的遗留问题:
1.如果安装的机器上存在sqlserver2005 则本程序的sqlserver桌面引擎会安装失败;
2.安装过程中的信息切换会在操作系统的最前面,所以会把你别的程序的界面覆盖掉,除非你用 窗口键 +D键 最小化所有应用;

如果哪位网友解决了这个问题,请将解决方法及源码留在本留言栏,如有疑问也请留言,谢谢。
Name 超能 System

SetCompressor zlib

Defines
!define REGKEY "SOFTWARE$(^Name)"
!define VERSION 1.0
!define COMPANY 超能公司
!define URL www.XXXX.com

MUI defines
!define MUI_ICON logo.ico
!define MUI_UNICON logo.ico
!define MUI_FINISHPAGE_NOAUTOCLOSE

定义readme
!define MUI_FINISHPAGE_SHOWREADME $INSTDIRreadme.txt
!define MUI_FINISHPAGE_RUN "$PROGRAMFILESInternet ExplorerIEXPLORE.EXE"
!define MUI_FINISHPAGE_RUN_PARAMETERS 登录主页的url

!define MUI_CUSTOMFUNCTION_GUIINIT CustomGUIInit
!define MUI_UNFINISHPAGE_NOAUTOCLOSE

Included files
!include Sections.nsh
!include MUI.nsh
!include "LogicLib.nsh" 
!include "${NSISDIR}ExamplesSystemSystem.nsh" 
!include WinMessages.nsh

Reserved Files
ReserveFile "${NSISDIR}PluginsBGImage.dll"
ReserveFile "${NSISDIR}PluginsAdvSplash.dll"

Variables
Var StartMenuGroup

Installer pages
!insertmacro MUI_PAGE_WELCOME

!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_PAGE_FINISH
!insertmacro MUI_UNPAGE_CONFIRM
!insertmacro MUI_UNPAGE_INSTFILES

Installer languages
!insertmacro MUI_LANGUAGE SimpChinese

Caption "超能MIS"

Icon "imginstall.ico"
BrandingText " 超能有限公司 -- www.超能.com "

Installer attributes
OutFile 超能.Exe
InstallDir $PROGRAMFILES超能

!define MUI_HEADERIMAGE
CRCCheck on
XPStyle on
ShowInstDetails show

nevershow
VIProductVersion 1.0.0.0
VIAddVersionKey /LANG=${LANG_SIMPCHINESE} ProductName 超能system
VIAddVersionKey ProductVersion "${VERSION}"
VIAddVersionKey /LANG=${LANG_SIMPCHINESE} CompanyName "${COMPANY}"
VIAddVersionKey /LANG=${LANG_SIMPCHINESE} CompanyWebsite "${URL}"
VIAddVersionKey /LANG=${LANG_SIMPCHINESE} FileVersion ""
VIAddVersionKey /LANG=${LANG_SIMPCHINESE} FileDescription ""
VIAddVersionKey /LANG=${LANG_SIMPCHINESE} LegalCopyright ""
InstallDirRegKey HKLM "${REGKEY}" Path
ShowUninstDetails hide

UninstallText "将要卸载 超能system .点击继续."
UninstallIcon "imguninstall.ico"
var DBPATH

Installer SQL Server 2000 sections
Section SqlServer SEC0000
#MessageBox MB_OK $EXEDIR
#调用第一个信息
IntOp $9 0 + 1
call showBg

StrCpy $DBPATH $INSTDIR
;ReadRegStr $0 HKLM "Software\Microsoft\MSSQLServer\Setup" "SQLPath"
ReadRegStr $0 HKLM "Software\Microsoft\Microsoft SQL Server\XXXX\Setup" "SQLPath"
StrCmp $0 "" 0 +9
DetailPrint "正在安装SQL Server 2000 桌面引擎,请等约两分钟。 "
ExecWait '"$EXEDIR\Disk1\MSDERelA\setup.exe" DISABLENETWORKPROTOCOLS=0 SAPWD="XXXXXX"
SECURITYMODE=SQL INSTANCENAME="XXXX" DATADIR="$INSTDIR\" TARGETDIR="$INSTDIR"'
DetailPrint "SQL Server 2000 桌面引擎安装完成!"
IfFileExists $DBPATH\MSSQL$$XXXX\Data\XXXXX.mdf 0 +2
Delete /REBOOTOK $DBPATH\MSSQL$$XXXXX\Data\XXXXX.mdf
IfFileExists $DBPATH\MSSQL$$XXXXX\Data\XXXXX_log.LDF 0 +2
Delete /REBOOTOK $DBPATH\MSSQL$$XXXXX\Data\XXXXX_log.LDF
goto +2
StrCpy $DBPATH $0
IntOp $9 0 + 2
call showBg
ExecWait '"net.exe" start MSSQL$$XXXXX'
ExecWait '"osql.exe" -U sa -P XXXXXX -S .\XXXXX -Q "Create Database XXXXX"'
DetailPrint "正在恢复演示数据!请耐心等待。"
ExecWait '"osql.exe" -U sa -P styx2008 -S .\XXXXX -Q "restore database XXXX from
disk=$\'$EXEDIRDisk1XXXX$\' with move $'XXXX_Data$' to

$\'$DBPATHMSSQL$$XXXX\Data\XXXX.mdf$', move $\'XXXX_Log$' to

$\'$DBPATHMSSQL$$XXXX\Data\XXXX_log.LDF$'"'
DetailPrint "演示数据恢复完成!"
IntOp $9 0 + 3
 call showBg
SectionEnd

Installer jdk1.5.0_06 sections
Section -JDK5 SEC0001
SetOutPath $INSTDIR
File readme.txt 
File img\install.ico

DetailPrint "正在安装Java虚拟机!"
SetOutPath "$INSTDIR\jdk1.5.0_06" 
SetOverwrite on
File /r "C:\Program Files\Java\jdk1.5.0_06\*"
push $9
IntOp $9 0 + 4
call showBg
pop $9
;SetOutPath $INSTDIR
SendMessage ${HWND_BROADCAST} ${WM_WININICHANGE} 0 "STR:Environment" /TIMEOUT=0
WriteRegExpandStr HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"
"JAVA_HOME" "$INSTDIRjdk1.5.0_06"

WriteRegExpandStr HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"
"TOMCAT_HOME" "$PROGRAMFILESTomcat 5.0"

SendMessage ${HWND_BROADCAST} ${WM_WININICHANGE} 0 "STR:Environment" /TIMEOUT=0
WriteRegStr HKLM "${REGKEY}\Components" JDK5 1
    
DetailPrint "Java虚拟机安装完成!"
 push $9
IntOp $9 0 + 5
call showBg
pop $9
SectionEnd

Installer Tomcat 5.0 sections
Section -Server SEC0002

IntOp $9 0 + 6
call showBg
DetailPrint "正在安装WEB服务器!"
SetOutPath "$PROGRAMFILES\Tomcat 5.0"
SetOverwrite on 
File /r "D:\Tomcat 5.0\*"
push $9
IntOp $9 0 + 7
call showBg
pop $9
;ReadRegStr $0 HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"
"TOMCAT_HOME"

;WriteRegExpandStr HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"
"TOMCAT_HOME" "$PROGRAMFILESTomcat 5.0"

SendMessage ${HWND_BROADCAST} ${WM_WININICHANGE} 0 "STR:Environment" 
在windows服务中加入”启动服务“项
ExecWait '"$PROGRAMFILES\Tomcat 5.0\bin\NetInstall.bat" "$PROGRAMFILES\Tomcat 5.0\bin"
"$INSTDIRjdk1.5.0_06"'

#ExecWait '"$PROGRAMFILES\Tomcat 5.0\bin\tomcat5.exe" //IS//XXXX --DisplayName="XXXX"
--Install="$PROGRAMFILESTomcat 5.0bintomcat5.exe" --Jvm=auto --StartMode=jvm --

StopMode=jvm --StartClass=org.apache.catalina.startup.Bootstrap --StartParams=start --

StopClass=org.apache.catalina.startup.Bootstrap --StopParams=stop'

#ExecWait '"$PROGRAMFILES\Tomcat 5.0\bin\tomcat5.exe" //IS//XXXX --DisplayName="XXXX"
--Install="$PROGRAMFILES\Tomcat 5.0\bin\tomcat5.exe" --Jvm="$INSTDIRjdk1.5.0_06

jrebinserverjvm.dll" --StartMode=jvm --StopMode=jvm --

StartClass=org.apache.catalina.startup.Bootstrap --StartParams=start --

StopClass=org.apache.catalina.startup.Bootstrap --StopParams=stop'

ExecWait '"$PROGRAMFILES\Tomcat 5.0\bin\tomcat5.exe" //US//XXXX --Description="XXXX" -
-Startup=auto'

DetailPrint "WEB服务器安装完成!"
DetailPrint "WEB服务器开始启动!"
 push $9
IntOp $9 0 + 8
call showBg
pop $9
启动tomcat

ExecWait '"net" start XXXX'
push $9
IntOp $9 0 + 9
call showBg
pop $9
DetailPrint "WEB服务器启动完成!"
WriteRegStr HKLM "${REGKEY}\Components" Server 1
push $9
IntOp $9 0 + 10
call showBg
pop $9

push $1
push $0
读取当前数据库实例的端口,并且写入应用的配置文件
ReadRegStr $1 HKLM "Software\Microsoft\Microsoft SQL
ServerXXXXMSSQLServerSuperSocketNetLibTcp" "TcpPort"

StrCmp $1 "" done 0
;IfFileExists $PROGRAMFILES\Tomcat 5.0\webapps\XXXX\WEB-INF\Node.driver.xml 0 +2
FileOpen $0 '$PROGRAMFILES\Tomcat 5.0\webapps\XXXX\WEB-INF\Node.driver.xml' w
FileWrite $0 '<?xml version="1.0" encoding="utf-8"?>$\r$\n'
FileWrite $0 '<driver project-version="1.0"
class="com.microsoft.jdbc.sqlserver.SQLServerDriver">$\r$n'

FileWrite $0 '<url
value="jdbc:microsoft:sqlserver://127.0.0.1:$1;DatabaseName=XXXX"/>$r$n'

FileWrite $0 '<connectionPool min="1" max="100" />$\r$\n'
FileWrite $0 '<login userName="sa" password="XXXX"/>$\r$\n'
FileWrite $0 '</driver>'
FileClose $0
done:

pop $1
pop $0
; CopyFiles $INSTDIR\*.dat $INSTDIRbackup

SectionEnd

Installer Shortcut sections
Section -Shortcut SEC0003

SetOutPath $SMPROGRAMS\$StartMenuGroup
CreateShortcut $SMPROGRAMS\$StartMenuGroup\bin.lnk "$PROGRAMFILES\Tomcat 5.0\bin"
CreateShortcut $SMPROGRAMS\$StartMenuGroup\超能系统.lnk "$PROGRAMFILES\Internet
ExplorerIEXPLORE.EXE " "http://127.0.0.1:8080/XXXX/login.jsp"

CreateShortcut $SMPROGRAMS\$StartMenuGroup\ReadMe.lnk "notepad.exe "
"$INSTDIRreadme.txt"

WriteRegStr HKLM "${REGKEY}\Components" Shortcut 1
IntOp $9 0 + 11
call showBg
SectionEnd

Section -post SEC0004

WriteRegStr HKLM "${REGKEY}" Path $INSTDIR
SetOutPath $INSTDIR
WriteUninstaller $INSTDIR\uninstall.exe
SetOutPath $SMPROGRAMS\$StartMenuGroup
CreateShortcut "$SMPROGRAMS\$StartMenuGroup\$(^UninstallLink).lnk"
$INSTDIRuninstall.exe

WriteRegStr HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$(^Name)"
DisplayName "$(^Name)"

WriteRegStr HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$(^Name)"
DisplayVersion "${VERSION}"

WriteRegStr HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$(^Name)"
Publisher "${COMPANY}"

WriteRegStr HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$(^Name)"
URLInfoAbout "${URL}"

WriteRegStr HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$(^Name)"
DisplayIcon $INSTDIRlogo.ico

WriteRegStr HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$(^Name)"
UninstallString $INSTDIRuninstall.exe

WriteRegDWORD HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$(^Name)"
NoModify 1

WriteRegDWORD HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$(^Name)"
NoRepair 1

IntOp $9 0 + 12
call showBg
SectionEnd

Macro for selecting uninstaller sections
!macro SELECT_UNSECTION SECTION_NAME UNSECTION_ID

Push $R0
ReadRegStr $R0 HKLM "${REGKEY}\Components" "${SECTION_NAME}"
StrCmp $R0 1 0 next${UNSECTION_ID}
!insertmacro SelectSection "${UNSECTION_ID}"
GoTo done${UNSECTION_ID}
next${UNSECTION_ID}:

!insertmacro UnselectSection "${UNSECTION_ID}"
done${UNSECTION_ID}:

Pop $R0
!macroend

Uninstaller sections
Section /o un.Server UNSEC0000

ExecWait '"cd" /d $PROGRAMFILES\Tomcat 5.0\bin'
ExecWait '"net" stop XXXX'
ExecWait '"$PROGRAMFILES\Tomcat 5.0\bin\NetRemove.bat" "$PROGRAMFILES\Tomcat 5.0\bin"'
Delete /REBOOTOK $INSTDIR\readme.txt
Delete /REBOOTOK $INSTDIR\install.ico
RmDir /r /REBOOTOK "$PROGRAMFILES\Tomcat 5.0"
DeleteRegValue HKLM "${REGKEY}\Components" Server
SectionEnd

Section /o un.Shortcut UNSEC0001

Delete /REBOOTOK $SMPROGRAMS\$StartMenuGroup\bin.lnk
Delete /REBOOTOK $SMPROGRAMS\$StartMenuGroup\超能系统登录.lnk
Delete /REBOOTOK $SMPROGRAMS\$StartMenuGroup\ReadMe.lnk 
RmDir /r /REBOOTOK "$SMPROGRAMS\$StartMenuGroup"
DeleteRegValue HKLM "${REGKEY}\Components" Shortcut
SectionEnd

Section /o un.JDK5 UNSEC0002

 RmDir /r /REBOOTOK "$INSTDIR\jdk1.5.0_06"
 DeleteRegValue HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"
"JAVA_HOME"

 DeleteRegValue HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"
"TOMCAT_HOME"

 SendMessage ${HWND_BROADCAST} ${WM_WININICHANGE} 0 "STR:Environment" /TIMEOUT=0
 DeleteRegValue HKLM "${REGKEY}\Components" JDK5
SectionEnd

Section un.post UNSEC0003

DeleteRegKey HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$(^Name)"
Delete /REBOOTOK "$SMPROGRAMS\$StartMenuGroup\$(^UninstallLink).lnk"
Delete /REBOOTOK $INSTDIR\uninstall.exe
DeleteRegValue HKLM "${REGKEY}" Path
DeleteRegKey /IfEmpty HKLM "${REGKEY}\Components"
DeleteRegKey /IfEmpty HKLM "${REGKEY}"
RmDir /REBOOTOK $SMPROGRAMS\$StartMenuGroup
RmDir /REBOOTOK $INSTDIR
SectionEnd

Installer functions
Function CustomGUIInit

CreateFont $R1 "华文中宋" 15 500 #/NORMAL 
IntOp $9 0 + 0
call showBg
CALL repositionWindow
;System::Call "User32::SetWindowPos(i, i, i, i, i, i, i) b ($HWNDPARENT, -1, 0, 0, 0, 0,
${SWP_NOOWNERZORDER}|${SWP_NOSIZE})"

FunctionEnd

Function .onGUIEnd

BGImage::Destroy
FunctionEnd

Function .onInit

InitPluginsDir
StrCpy $StartMenuGroup "超能系统"
Push $R1

File /oname=$PLUGINSDIR\bg.bmp "img\bg.bmp"
File /oname=$PLUGINSDIR\spltmp.bmp img\MainSplash.bmp
advsplash::show 1000 600 400 -1 $PLUGINSDIR\spltmp
Pop $R1
Pop $R1
FunctionEnd

Uninstaller functions
Function un.onInit

ReadRegStr $INSTDIR HKLM "${REGKEY}" Path
StrCpy $StartMenuGroup "超能系统"
!insertmacro SELECT_UNSECTION Server ${UNSEC0000}
!insertmacro SELECT_UNSECTION Shortcut ${UNSEC0001}
!insertmacro SELECT_UNSECTION JDK5 ${UNSEC0002}
FunctionEnd
Function repositionWindow

;Save existing register values to the stack
Push $0
Push $1
Push $2
Push $3
Push $4
Push $5
Push $6
Push $7
Push $8
; !define SPI_GETWORKAREA 0x0030
; !define SWP_NOSIZE 0x0001
; !define SWP_NOOWNERZORDER 0x0200

; Reposition window in the lower left
; Create RECT struct
System::Call "*${stRECT} .r1"
; Find Window info for the window we're displaying
System::Call "User32::GetWindowRect(i, i) i ($HWNDPARENT, r1) .r2"
; Get left/top/right/bottom
System::Call "*$1${stRECT} (.r2, .r3, .r4, .r5)"

; Calculate width/height of our window
IntOp $2 $4 - $2 ; $2 now contains the width
IntOp $3 $5 - $3 ; $3 now contains the height

; Determine the screen work area
System::Call "User32::SystemParametersInfo(i, i, i, i) i (${SPI_GETWORKAREA}, 0, r1, 0)
.r4"

; Get left/top/right/bottom
System::Call "*$1${stRECT} (.r4, .r5, .r6, .r7)"

System::Free $1

; Right side of screen - window - 10
IntOp $0 $6 - $2
IntOp $0 $0 / 2
; Left side of screen + 10
;IntOp $0 $4 + 10

; Bottom of screen - window - 5
IntOp $1 $7 - $3
IntOp $1 $1 / 2
IntOp $8 $7 / 10
IntOp $1 $1 + $8

System::Call "User32::SetWindowPos(i, i, i, i, i, i, i) b ($HWNDPARENT, -1, $0, $1, 0,
0, ${SWP_NOOWNERZORDER}|${SWP_NOSIZE})"

;Restore register values from the stack
Pop $8
Pop $7
Pop $6
Pop $5
Pop $4
Pop $3
Pop $2
Pop $1
Pop $0
FunctionEnd 
Function showBg
BgImage::Clear /NOUNLOAD
BgImage::SetBg /NOUNLOAD /FILLSCREEN $PLUGINSDIRbg.bmp
${Switch} $9 
${Case} 0

      BGImage::AddText /NOUNLOAD "  信息1。" $R1 0 0 0 40 130 990 230
      ${Break}
${Case} 1

   ;BGImage::AddImage /NOUNLOAD 38 130 $EXEDIR\img\1.bmp
   BGImage::AddText /NOUNLOAD "  信息2 " $R1 0 0 0 40 130 990 230
   ${Break}
${Case} 2

   BGImage::AddText /NOUNLOAD "信息3" $R1 0 0 0 200 130 990 230
   ${Break}
${Case} 3

   BGImage::AddText /NOUNLOAD "信息4" $R1 0 0 0 220 150 990 230
   ${Break}
${Case} 4

   BGImage::AddText /NOUNLOAD "   信息5" $R1 0 0 0 180 130 850 230
   ${Break}
${Case} 5

   BGImage::AddText /NOUNLOAD "  信息6" $R1 0 0 0 120 130 880 230
   ${Break}
${Case} 6

   BGImage::AddText /NOUNLOAD "“信息7" $R1 0 0 0 330 170 990 230
   ${Break}
${Case} 7

   BGImage::AddText /NOUNLOAD "信息8" $R1 0 0 0 400 170 990 230
   ${Break}
${Case} 8

   BGImage::AddText /NOUNLOAD "信息9" $R1 0 0 0 300 150 990 230
   ${Break}
${Case} 9

   BGImage::AddText /NOUNLOAD "信息10" $R1 0 0 0 400 170 990 230
   ${Break}
${EndSwitch}
BGImage::Redraw /NOUNLOAD
FunctionEnd

/*Function WriteEnvStr
Exch $1 ; $1 has environment variable value
Exch
Exch $0 ; $0 has environment variable name
Push $2

Call IsNT
Pop $2
StrCmp $2 1 WriteEnvStr_NT

; Not on NT
StrCpy $2 $WINDIR 2 ; Copy drive of windows (c:)
FileOpen $2 "$2\autoexec.bat" a
FileSeek $2 0 END
FileWrite $2 "$\r$\nSET $0=$1$\r$\n"
FileClose $2
SetRebootFlag true
Goto WriteEnvStr_done
WriteEnvStr_NT:

  ;WriteRegExpandStr ${WriteEnvStr_RegKey} $0 $1
  SendMessage ${HWND_BROADCAST} ${WM_WININICHANGE} \
    0 "STR:Environment" /TIMEOUT=5000
WriteEnvStr_done:

Pop $2
Pop $0
Pop $1
FunctionEnd*/

Installer Language Strings
TODO Update the Language Strings with the appropriate translations.
LangString ^UninstallLink ${LANG_SIMPCHINESE} "Uninstall $(^Name)"

脚本如上,和广大网友分享。如有转贴,请说明出处和本日志链接。

  

上一篇:CF960G Bandit Blues


下一篇:Bandit算法在携程推荐系统中的应用与实践