1、NSIS简介

官网:http://sourceforge.net/projects/nsis/

维基百科:

http://zh.wikipedia.org/wiki/Nullsoft%E8%85%B3%E6%9C%AC%E5%AE%89%E8%A3%9D%E7%B3%BB%E7%B5%B1

2、Section

想main函数对于C语言一样,Section是NSIS的入口,区别在于:C语言中main函数只有一个,NSIS中Section却可以有多个,但最少得有一个。

NSIS中的Section按照在文件中的顺序依次执行。

所有的 Section 都是按照从上到下的顺序执行的,每个 Section 可以用 /o 参数指定默认不选中,也可以使用 SectionSetFlags之类的命令来更改状态。并非每个Section都一定会执行:假如你显示了组件页面,除了你用脚本或命令来控制选择,用户也可以更改组件状态,NSIS 自动根据是否选择来决定执行。如果你没有显示组件页面,那么当然会根据组件的最终状态(使用 Section /o 预设状态以及 SectionSetFlags 更改状态)来决定是否执行。

3、Page

Page指的是安装程序的向导页面。

4、Function

NSIS中的函数分为用户自定义函数和回调函数。

自定义函数需要通过Call命令来调用,回调函数是在特定的时间点触发的程序段。

以下是几个基本的回调函数,以on开头的是安装过程的回调,以un.on开头的是卸载过程的回调:

.onGUIInit

第一个页面被载入并且显示安装程序对话框前被调用,允许你来调整用户界面。

.onInit

在当安装程序接近完成初始化时调用。如果 .onInit 函数调用了 Abort,则安装程序立即退出。

.onInstFailed

该回调函数当在安装失败后用户点击“取消”按钮时被调用 (如果安装程序不能释放任何文件,或安装脚本使用了 Abort 命令)。

.onInstSuccess

当安装成功且正当安装窗口关闭前 (如果 AutoCloseWindow 或 SetAutoClose 被设为 false 时可能在用户点击“关闭”之后) 调用。

. onGUIEnd

正当安装程序窗口关闭之后被调用。需要时用来释放任何与用户界面有关的插件。

.onMouseOverSection

只要鼠标在树形区段选择框上移动时就被调用。这可以使你给每个区段设置一个样本描述。鼠标停留所在的当前区段 ID 已被临时的保存,为 $0。

.onRebootFailed

当 Reboot 指令失败时被调用。WriteUninstaller、plug-ins、File 和 WriteRegBin 不能用于该回调函数。

.onSelChange

当在组件选择页面选项被改变时被调用。常用于使用 SectionSetFlags 和 SectionGetFlags。

.onUserAbort

当用户点击“取消”按钮且安装尚未失败时被调用。如果该函数调用 Abort,则安装将不退出。

.onVerifyInstDir

该回调对于你的安装程序来说可以允许代为控制安装路径是否有效。每次用户更改安装路径的时候这段代码都会被调用一次,所以不要在这里使用 MessageBox 等傻指令。如果该函数调用 Abort,则 $INSTDIR 的路径被认为无效。

un.onGUIInit

在第一个页面被载入并且显示卸载程序对话框前被调用,允许你来调整卸载程序的界面。

un.onInit

当卸载程序接近完成初始化时调用。如果 un.onInit 函数使用了 Abort ,则卸载程序立即退出。注意如果需要时该函数可以验证和/或修改 $INSTDIR。

un.onUninstFailed

当在卸载失败后用户点击“取消”按钮时被调用 (如果使用了 Abort 命令或其它失败的命令)。

un.onUninstSuccess

当卸载成功且正当卸载程序窗口关闭前 (如果 SetAutoClose 被设为 false 时可能在用户点击“关闭”之后) 调用。

un.onGUIEnd

正当卸载程序窗口关闭之后被调用。需要时用来释放任何与用户界面有关的插件。

un.onRebootFailed

当 Reboot 指令失败时被调用。WriteUninstaller、plug-ins、File 和 WriteRegBin 不能用于该回调函数。

un.onUserAbort

当用户点击“取消”按钮且卸载尚未失败时被调用。如果该函数调用 Abort,则卸载程序将不退出。

5、指令

指令主要指仅在编译时刻执行的命令,主要包括:包含文件、条件化编译、定义常量、定义宏等。

例如:

定义常量:!define PI 3.14

定义宏:

!macro name parameterlist

!macroend

调用宏:!insertmacro name

以上是最常用的组件,简单说明了下概念,接下来正式开始打包旅程。

NSIS打包(一)常用概念简介的更多相关文章

  1. 007-elasticsearch5.4.3【一】概述、Elasticsearch 访问方式、Elasticsearch 面向文档、常用概念

    一.概述 Elasticsearch 是一个开源的搜索引擎,建立在一个全文搜索引擎库 Apache Lucene™ 基础之上. Elasticsearch 也是使用 Java 编写的,它的内部使用 L ...

  2. 【Machine Learning】机器学习及其基础概念简介

    机器学习及其基础概念简介 作者:白宁超 2016年12月23日21:24:51 摘要:随着机器学习和深度学习的热潮,各种图书层出不穷.然而多数是基础理论知识介绍,缺乏实现的深入理解.本系列文章是作者结 ...

  3. Sublime 常用插件简介

    Sublime   常用插件简介 emmet: 前端必备神器.花个十几分钟学下Emmet语法 ,就可以极大提高web开发者HTML和CSS工作效率啦.一句话,牛逼---必备 CSS3: CSS3语法高 ...

  4. SpringBoot常用配置简介

    SpringBoot常用配置简介 1. SpringBoot中几个常用的配置的简单介绍 一个简单的Spring.factories # Bootstrap components org.springf ...

  5. 依赖注入及AOP简述(十)——Web开发中常用Scope简介 .

    1.2.    Web开发中常用Scope简介 这里主要介绍基于Servlet的Web开发中常用的Scope. l        第一个比较常用的就是Application级Scope,通常我们会将一 ...

  6. NSIS API 函数常用备份

    原文:NSIS API 函数常用备份 关闭程序: System::Call `user32::AnimateWindow(i$HWNDPARENT,i200,i${AW_BLEND}|${AW_HID ...

  7. Redis API与常用数据类型简介

    Redis API与常用数据类型简介 一.Redis API For .Net 首先,不得不说Redis官方提供了众多的API开发包,但是目前Redis官方版本不支持.Net直接进行连接,需要使用一些 ...

  8. java 并发多线程显式锁概念简介 什么是显式锁 多线程下篇(一)

    目前对于同步,仅仅介绍了一个关键字synchronized,可以用于保证线程同步的原子性.可见性.有序性 对于synchronized关键字,对于静态方法默认是以该类的class对象作为锁,对于实例方 ...

  9. Java多线程概念简介 多线程中篇(一)

    Java的线程与操作系统的线程   在线程的相关介绍中,有讲到“线程的实现”分为三种:内核支持,用户级以及两者混合.(这只是一种简要的分类) Java线程在JDK1.2之前,是用户线程实现的 而在JD ...

随机推荐

  1. Nullable<>

    Nullable<>是一个结构,但是怎么能让此结构=null,这是编译器的一个比较特殊的,他会new一个该结构的实例去赋值.Nullable<>有一个属性是HasValue,是 ...

  2. MyEclipse中Maven的配置

    之前在MyEclipse这个IDE中配置Maven,完成配置后启动Maven时出现-Dmaven.multiModuleProjectDirectory system propery is not s ...

  3. SQLSTATE[HY000] [2003] Cant connect to MySQL server

    今天要连远程数据库,结果PHP报错 Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY000] [2003 ...

  4. zookeeper初识之原理

    ZooKeeper 是一个分布式的,开放源码的分布式应用程序协调服务,它包含一个简单的原语集,分布式应用程序可以基于它实现同步服务,配置维护和命名服务等. Zookeeper是hadoop的一个子项目 ...

  5. 关于PCA的几何表示——MATLAB实现

    关于PCA的一道练习题.这个折腾了好久...终于做出来像样的图,开始的时候忘记对原始数据标准化,怎么也不对.经过标准化之后,做的图看着还可以,有错误请指出! MATLAB代码PCA.m: clear ...

  6. RabbitMQ/JAVA 客户端测试(补:利用线程)

    上次进行了简单的连接测试.这次主要进行一下小小的补充.利用线程将生产者消费者代码合到一个文件中. 我是将Recv.java(消费者)文件放在一个线程里添加到Send.java(生产者)中. 代码如下: ...

  7. ios学习之UISwipeGestureRecognizer手势识别

    ios学习之UISwipeGestureRecognizer手势识别   本文部分转自俺是一个瓜娃!!!的博客UISwipeGestureRecognizer ---手指动作,转载过来仅是为了自己查询 ...

  8. 传智播客JavaWeb day03

    ServletContext 这堂课主要讲ServletContext这个web域(可以看得见范围的)对象,web在启动的时候会创建唯一的ServletContext域对象. 作用:1.用来web域共 ...

  9. 摘要评注The Cathedral & The Bazaar

    2013年暑期买到这本书,距离其第一版已经有14年之久,而最早发布在互联网上的文章更是早在1997年.在我阅读的时候,很多事迹已经沉积为历史,很多预言已经成为现实.而这本书的意义却丝毫没有因此淡化,反 ...

  10. iOS常用设计模式和机制之代理

    Delegate : 1 代理设计模式的使用我们首先需要明白三个要素 *委托方:委托别人去执行某些操作的人(对象) *代理方:被委托区执行某些操作的人(对象) *协议:(protocol)委托方需要代 ...