NSIS安装程序概要

概述:
NSIS (Nullsoft Scriptable Install System)是一个Open Source的Windows系统下安装程序制作程序。它提供了安装、卸载、系统设置、文件解压缩等功能。这如其名字所指出的那样,
NSIS是通过它的脚 本语言来描述安装程序的行为和逻辑的。NSIS的脚本语言和通常的编程语言有类似的结构和语法,但它是为安装程序这类应用所设计的。NSIS脚本通常以 nsi为扩
展名,支持include功能,头文件扩展名为nsh。
NSIS的主要特点:

  • 开销小,一个完整功能的安装程序仅需要34k的额外开销;
  • 支持大多数Windows平台,包括:Windows 9.x,Windows NT, Windows 2000, Windows XP, Windows 2003;
  • 支持三大压缩算法: Zlig, BZips, LZMA;
  • 支持脚本;
  • 支持多语言;
  • 支持安装界面定制;
  • 提供可扩展的插件接口;
  • 支持网络安装、补丁;
  • 支持无人值守的安装模式;
  • 此外,NSIS的license允许任何用途免费使用;

制作一个NSIS的安装程序通常有以下几步:

  1. 确定安装的功能和界面元素;
  2. 编写NSIS脚本 ;
  3. 使用NSIS提供的makensis或者makensisw程序,将步骤2编写的脚本编译成可执行的安装程序;
  4. 调试安装程序,如果有问题退到第二步重复;
  5. 随着NSIS的流行,有一些第三方的NSIS脚本开发环境出现了,如使用易量安装集成开发环境,步骤2,3可以方便的组合在一起;

NSIS脚本的结构:

NSIS脚本(下称nsi脚本)主要包含安装程序属性、页面、区段、函数。
属性用来定义安装程序的行为和界面风格,这些属性大部分是编译时刻属性,即不能在运行时刻改变。
页面是指安装程序的向导页面,示例:
Page license
Page components
Page directory
Page instfiles
UninstPage uninstConfirm
UninstPage instfiles
区段是对应某种安装/卸载选项的处理逻辑,该段代码仅当用户选择相应的选项才被执行。卸载程序的区段名用”un.”作为前缀,示例如下:
Section "Installer Section"
SectionEnd

Section "un.Uninstaller Section"
SectionEnd

在区段中可以使用很多指令用来完成诸如解压缩文件、读写注册表、创建目录、创建快捷方式等任务,但最常用的指令是SetOutPath和File,前者用于指定目的位置,后者用于指定文
件。示例:

Section "My Program"
SetOutPath $INSTDIR
File "My Program.exe"
File "Readme.txt"
SectionEnd

区段名的修饰符/o表示该区段默认不选上,-表示隐藏区段(匿名区段也是隐藏区段),!表示需要粗体显示的区段。

SectionIn表示该区段和安装类型之间的关系:
SectionIn insttype_index [insttype_index] … [RO]
RO修饰符表示不可修改。

子区段用于包含多个区段:
SubSection [/e] Caption [subsection_name index output]
修饰符/e用于该子区段的所有区段是否默认展开。

函数包含了模块化的安装逻辑,在nsi脚本中函数分为两种:用户自定义函数和回调函数。用户自定义函数仅当是Call指令调用时才被执行,如果函数体中没有abort语句,则安装程序
执行完了用户自定义函数,继续运行Call语句和指令。

用户自定义函数的语法如下:

Function <函数名>
# some commands
FunctionEn

可见无论是函数的定义还是函数的调用都没有参数传递。通常nsi的参数传递是通过堆栈操作Pop,Push和20个寄存器变量$0~$9, $R0~$R9进行的。也可以通过全局变量完成参数传
递。如:

Var input ;
Var output ;

Section bla
DeteailPrint "input is $input$\n"
Call square
DeteailPrint "square of $input is $output$\n"
SectionEnd

Function square
output = input^2
FunctionEnd

回调函数则是由在特定的时间点触发的程序段。常用的回调函数如.onInit:

Function .onInit
MessageBox MB_YESNO "This will install My Program. Do you wish to continue?" IDYES gogogo
Abort
gogogo:
FunctionEnd

NSIS对于安装逻辑定义以下回调函数:.onGUIInit、.onInit、.onInstFailed、.onInstSuccess、. onGUIEnd、.onMouseOverSection、.onRebootFailed、.onSelChange、.onUserAbort、. onVerifyInstDir
NSIS对于卸载逻辑定义以下回调函数:un.onGUIInit、un.onInit、un.onUninstFailed、un.onUninstSuccess、un.onGUIEnd、un.onRebootFailed、un.onUserAbort
NSIS脚本的变量定义:

NSIS脚本的变量定义用Var关键字,后跟变量名,变量是全局的并且是大小写敏感的。变量引用时需要加上前缀$。
除了用户自定义的变量外,nsi脚本中与定义寄存器变量$0~$9,$R0~$R9用于参数传递,以及系统变量用于特定用途,这些变量主要有:
$INSTDIR,$OUTDIR,$CMDLINE,$LANGUAGE这些变量都是可写的。

$PROGRAMFILES,$COMMONFILES,$DESKTOP,$EXEDIR,${NSISDIR},$WINDIR,$SYSDIR,$ TEMP,$STARTMENU,$SMPROGRAMS,$SMSTARTUP,$QUICKLAUNCH,$DOCUMENTS,$SENDTO,$ RECENT,$FAVORITES,$MUSIC,$PICTURES,$VIDEOS,$NETHOOD,$FONTS,$TEMPLATES,$ APPDATA,$PRINTHOOD,$INTERNET_CACHE,$COOKIES,$HISTORY,$PROFILE,$ ADMINTOOLS,$RESOURCES,$RESOURCES_LOCALIZED,$CDBURN_AREA,$HWNDPARENT,$ PLUGINSDIR

NSIS脚本中可用于调试的系统函数有MessageBoxes,DetailPrint,Dumpstate。
NSIS脚本的编译器指令:
NSIS脚本的编译器指令主要指仅在编译时刻执行的命令。这些命令主要用来包含文件、条件化编译、定义常量、定义宏等。定义常量和宏是编译器指令最主要应用。
定义常量的示例:

!define VERSION “1.0.3”
Name “My Program ${VERSION}”
OutFile “My Program Installer – ${VERSION}.exe”

定义宏的示例:

!macro MyFunc UN
Function ${UN}MyFunc
Call ${UN}DoRegStuff
ReadRegStr $0 HKLM Software\MyProgram key
DetailPrint $0
FunctionEnd

Modern UI:
Modern UI是感观上模仿最新的Windows系统的界面风格,它由欢迎页面、结束页面和其他向导页面构成。
插件:

NSIS支持插件,通过插件可以方便的扩展NSIS安装程序的功能。NSIS插件是用C++,Delphi等语言编写的dll,在nsi脚本中调用nsi中的函数使用如下语法:
DLLName::FunctionName “参数1” “参数2” “参数3”

示例1:

nsExec::ExecToLog ‘”${NSISDIR}\makensis.exe” /CMDHELP’

示例2:

InstallOptions::dialog “$PLUGINSDIR\test.ini”

显示对话框

示例3:

NSISdl::download http://download.nullsoft.com/winamp/client/winamp291_lite.exe $R0

下载文件

NSIS搜索插件的策略:
默认情况下NSIS在其安装目录的子目录Plugins中搜索插件,用户可以使用!addplugindir指定增加插件的目录位置。

© 版权声明
THE END
喜欢就支持一下吧
点赞15 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容