ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2019-08-02 18:52:31  阅读:311  来源: 互联网

标签:5.0 XXXX INSTDIR NSIS HKLM 安装程序 演示 MUI IntOp


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)"

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

  

标签:5.0,XXXX,INSTDIR,NSIS,HKLM,安装程序,演示,MUI,IntOp
来源: https://www.cnblogs.com/fuhuo/p/11290616.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有