“NSIS (Nullsoft Scriptable Install System) 是 Windows 下的一个工具,它允许程序员
来创建这样的安装程序。它发布于一个开源的协议并且对于任何使用来说都是完全免费的。”
--NSIS用户手册
Foobar是我听听音乐的工具,而且使用了Winamp那么长时间了,对Nullsoft非常熟悉,但是
可能是由于整个公司的软件开放程度不高吧,具体它有些什么特长的东西一直不清楚。所以第
一次听说有一个NSIS的东西可以方便灵活的定制安装程序,是Nullsoft退出的,我还有些惊讶。
“NSIS 创建的安装程序能够安装、卸载、设置系统设置、解压文件等等。因为它基于脚本文
件,你可以完全的控制安装程序的每一部分。脚本语言支持变量、函数、字串 *** 作,就像一个
普通的程序语言一样 - 但是设计来创建安装程序。即使有那么多的特性,NSIS 仍然是最小的
安装程序系统。在默认选项下,它仅增加了 34 KB 的开销。”--NSIS用户手册
不过看到NSIS.sourceforge.net的若干图标,一下子我就想起来了,原来好多的软件都使用
它制作安装程序,特别是那个带一个向下箭头的圆球图标老是出现在开源软件的安装程序中。
结果我都不知道这个东西,是在是有些不好意思了。
说起来要学习制作一个基于NSIS的安装程序可不是一个小时就可以的事情(恐怕要两个小时 ),
因为制作一个安装程序需要学习NSIS的脚本编写,这基本上就是一门新的册败饥语言,是有一定
难度的。我自己的感觉是这种脚本语法简单,结构清除,由于使用了插件的方式扩展,功能相
当的强大(网络枯没上有不少各式各样的插件,自己也可以方便的编写)。如果运用熟练几乎可以
随心所欲的 *** 控安装程序,文件,网络以及 *** 作系统等等。而编写简单的安装程序更是手到擒
来,比如下面的一段相信大家一看就知道要做什么了。
---一个简单的安装程序
#
# 定义产品的信息,供以后程序使用
#
!define PRODUCT_NAME "TestSetup"
!define PRODUCT_VERSION "1.0"
!define PRODUCT_PUBLISHER "My company, Inc."
!define PRODUCT_WEB_SITE "http://www.mycompany.com"
!define PRODUCT_SERIAL_NUMBER "123" 序列号
!define TEMP_SN $R0 处理序列号对话框中用到的临时变量
#
# 显示的各个页面定义
#
Page license # 许可声明显示页
Page components # 选择安装组件
Page directory# 指定安装目录
Page instfiles# 安装拷贝显示页
#
# 设置总体的信息
#
Name "${PRODUCT_NAME} ${PRODUCT_VERSION}"
OutFile "${PRODUCT_NAME}-${PRODUCT_VERSION}.exe"
ShowInstDetails show
InstallDir "d:\tmp"
LicenseData "readme.txt"
# 我在这里默认只支持中文方式的安装
LoadLanguageFile "${NSISDIR}\Contrib\Language Files\SimpChinese.nlf"
#
# 各个段的详细定义(根据选择组件,执行各个区段)
#
Section "说明文件"
SetOutPath "$INSTDIR" # 将这里的文件安装到目标目录中。
SetOverwrite ifnewer
File "license.txt" "readme.txt"
SectionEnd
Section "正文"州返
SetOutPath "$INSTDIR" # 将这里的文件安装到目标目录中。
SetOverwrite ifnewer
File "About NSIS.txt"
DetailPrint "正文安装结束了!"
SectionEnd
----程序结束
像是上面这样的一个简单脚本也许就可以满足很多人的要求了,而许多商业安装程序工具生
成的结果也不过如此,可见NSIS这个开源的工具还是非常强大的,怪不得好多著名的软件都使
用它制作自己的安装程序(参见nsis的users)。在NSIS的Wiki上有好多非常实用的脚本和插
件供人们下载使用,论坛内的讨论也非常切入要害。更加难能可贵的是NSIS支持中文的程度非
常的高,国内不少有志人士为了这个东西作出了巨大贡献。所以文档和软件全部都有中文版本
,而像HM-NIS Edit这样的NSIS脚本编辑软件也是也从源代码级别进行了汉化,使用中完全没
有语言的障碍。
1 可能存在一些问差颂物题或者错误导致了现代化安装界面无法d出。2 原因可能是因为NSIS安装脚本虚液中缺少必要的插件或者资源文件,或者是安装脚本中的某些代码出现了错误,导致无法正常d出现代化安装界面。
3 在解决这个问题之前,我们需要先检查NSIS安装脚本中是否存在错误或者缺少必要的文件。
如果存在问题,需要进行修复或者补充。
另外,我樱余们还可以尝试使用其他NSIS插件或者第三方工具来实现现代化安装界面,以提高用户体验。
NSIS (Nullsoft Scriptable Install System)是一个OpenSource的Windows系统下安装程序制作程序。它提供了安装、卸载、系统设置、文件解压缩等功能。这如其名字所指出的那样,NSIS是通过它的脚
本语言来描述安装程序的行为和逻辑的。NSIS的脚本语言和通常的编程语言有类似的结构和迟信中语法,但它是为安装程序这类应用所设计的。码山NSIS脚本通常以
nsi为扩展名,支持include功能,头文件扩展名为nsh。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的安装程序通常有以下几步:
确定安装的功能和界面元素
编写NSIS脚本
使用NSIS提供的makensis或者makensisw程序,将步骤2编写的脚本编译成可执行的安装程序
调试安装程序,如果有问题退到第二步重复
随着NSIS的流行,有一些第三方的NSIS脚本开发环境出现了,如HM NIS Edit,Venis IX前者是完全开源的,后者仅对个人和非商业用途免费。在这些集成开发环境下,步骤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
FunctionEnd
函数的调用则使用以下语法:
Call <函数名>
可见无论是函数的定义还是函数的调用都没有参数传递。通常nsi的参数传递是通过堆栈 *** 作Pop,Push和20个寄存器变量~, $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
nsi脚本的变量定义
nsi脚本的变量定义用Var关键字,后跟变量名,变量是全局的并且是大小写敏感的。变量引用时需要加上前缀$。
除了用户自定义的变量外,nsi脚本中与定义寄存器变量~,$R0~$R9用于参数传递,以及系统变量用于特定用途,这些变量主要有:
$INSTDIR,$OUTDIR,$CMDLINE,$LANGUAGE这些变量都是可写的。
$PROGRAMFILES,$COMMONFILES,$DESKTOP,$EXEDIR,$,$WINDIR,$SYSDIR,$ TEMP,$STARTMENU,$SMPROGRAMS,$SMSTARTUP,$QUICKLAUNCH,$DOCUMENTS,$SENDTO,$ RECENT,$F***ORITES,$MUSIC,$PICTURES,$VIDEOS,$NETHOOD,$FONTS,$TEMPLATES,$ APPDATA,$PRINTHOOD,$INTERNET_CACHE,$COOKIES,$HISTORY,$PROFILE,$ ADMINTOOLS,$RESOURCES,$RESOURCES_LOCALIZED,$CDBURN_AREA,$HWNDPARENT,$ PLUGINSDIR
nsi脚本中可用于调试的系统函数有MessageBoxes,DetailPrint,Dumpstate。
nsi脚本的编译器指令
nsi脚本的编译器指令主要指仅在编译时刻执行的命令。这些命令主要用来包含文件、条件化编译、定义常量、定义宏等。定义常量和宏是编译器指令最主要应用。
定义常量的示例:
!define VERSION "1.0.3"
Name "My Program $"
OutFile "My Program Installer - $.exe"
定义宏的示例:
!macro MyFunc UN
Function $MyFunc
Call $DoRegStuff
ReadRegStr HKLM Software\MyProgram key
DetailPrint
FunctionEnd
Modern UI
Modern UI是感观上模仿最新的Windows系统的界面风格,它由欢迎页面、结束页面和其他向导页面构成。
插件
nsi支持插件,通过插件可以方便的扩展NSIS安装程序的功能。NSIS插件是用C++,Delphi等语言编写的dll,在nsi脚本中调用nsi中的函数使用如下语法:
DLLName::FunctionName "参数1" "参数2" "参数3"
示例1:
nsExec::ExecToLog '"$\makensis.exe" /CMDHELP'
执行makensis.exe命令,显示该命令用法。
示例2:
InstallOptions::dialog "$PLUGINSDIR\test.ini"
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)