构建:工程中的bulid操作,根据工程文件对相关资源和脚本进行编译,打包为安装包。
脚本:未特指的情况下,指代installshield中的installscript脚本方式。
IS:在此文档中,用于代表InstallShield的缩写。
InstallShield支持多种安装工程,目前只介绍安装几个常用工程,其他工程有待后续学习和补充。
自定义的安装过程,不依赖windows installer,脚本方法更灵活。
基于windows installer的标准msi工程,其使用windows Installer engine执行标准的msi action序列,通过action控制行为。
基于msi标准的脚本工程。其中包含windows Installer engine和InstallScript engine,除标准msi行为外,能自定义UI界面流程,接收msi事件并执行InstallScript脚本代码。
最根本的选择依据,就是选用那种安装引擎进行安装管理。
Basic Msi 工程
InstallScript 工程
InstallScript MSI 工程
Feature:要素,组成工程的基本单元,可自嵌套。
Component:组件,组成feature的基本单元,对应文件管理的基本单元。
该面板中,提供项目通用信息的设置。
改参数决定了工程文件的存储形式。推荐使用xml形式,工程文件(.ism)可以xml形式打开,明文内容,适合编辑操作。
工程的产品名称,会以属性的方式存储在工程中。在部分dialog的界面中,以%P调用,在脚本中,以IFX_PRODUCT_NAME调用。
工程的产品名称,会以属性的方式存储在工程中。在脚本中,以IFX_PRODUCT_VERSION调用。
版本号组成为结果为:主版本.小版本.构建编号.修订编号。版本取值范围最大值为255,编号最大值为216-1。(修订编号不用来区分不同的产品版本)
版本号在安装工程内,起着重要的作用。当安装程序运行时,会将版本信息通过安装引擎注册到系统中,以此作为程序升级的一个依据。
该参数通过影响系统默认属性removeonly的值,控制setup.exe的卸载行为。
程序的安装目录的初始值,会以属性方式存储在工程中。在windows安装程序中,一般设定到[ProgramFilesFolder](根据程序位数会有不同)目录下。
程序显示的Ico图标。具体表现在安装完成后,在程序列表中显示的图标。设置的图片路径必须是在目标机器上存在的,否则对应的图标会使用默认图标,建议使用系统目录或安装目录保存相关资源。
设置程序是否支持更新操作。具体表现在,在程序列表中是否可以进行修改操作。
设置程序是否支持卸载操作。具体表现在,在程序列表中是否可以进行卸载操作。
用于设计安装包的逻辑结构,可在面板中进行feature、component的添加和删除,以及属性的设置。
feature的显示名称。会在customsetup dialog中显示。
feature的描述信息。会在customsetup dialog中显示。
feature所关联的目录,该值会重写产品的目标路径。当用来计算勾选的feature所需要使用的磁盘空间时会用到。一般情况下,组件的关联目录应该和feature的关联目录保持一致。
是否在customsetup dialog中的树形图中显示feature,用于自定义安装交互勾选。
feature触发的事件绑定。
组件所关联的目录。
对关联目录的权限设置。该值会重写feature的目标路径。
设置是否在文件释放过程中,对已存在的文件进行复写。
设置组件是否标记为64位。会影响组件识别目录和注册表的路径。
设计对外交互的安装方式,主要是对feature的组合。
文件及目录结构树。该树图是对各个feature和component合并后的总览图,比较适合做安装资源文件的管理。
除了单个文件添加的方式,常用的添加文件的方式为动态文件链接(dynamic file linking)。通过动态链接,可以直接引用指定的文件夹,获取文件夹内的文件,按照设定规则过滤文件。
设置相关的依赖软件,可以绑定到指定的feature上。
设置快捷方式。
程序的注册表树图。该树图是对各个feature和component合并后的总览图,比较适合做注册表的操作。
支持reg形式的导入和导出,可以通过脚本对键值进行批量创建。
需要注意键值的图标代表了不同的操作方式,需要根据应用需求进行选择。
在赋值过程中,可以使用系统变量进行赋值,语法为#%+变量名,例如#%%TEMP%用来获取临时路径,等同于访问%TEMP%的值。如果使用的是MSI类型的工程,可以使用installer属性进行赋值,语法为[PropertyName],关于可使用的属性,参看微软官网,Property Reference - Win32 apps | Microsoft Docs。
msi的action序列,是msi工程所特有的。每个action通过数字编号,决定对应执行顺序。
安装工程的支持目录,可以用来存放临时数据文件和UI交互中所使用的的程序。
目录中支持添加相关资源,定制自己安装程序的初始化显示的splash界面和资源释放时的界面。
当安装程序运行时,会在系统临时目录中创建两个由guid命名的临时目录。由于是通过guid创建的,所以每次运行都是产生的目录名都是不固定的。
通过任务管理器,可以看到其实启动了两个安装引导程序。一个是双击打开的对应程序,另一个由上一个引导程序所调用打开的位于临时目录中的引导程序。而另一个目录就是SupportDir的所在。
当安装程序运行时,会自己释放临时安装文件,再将临时资源拷贝到SupportDir,之后UI交互界面才会弹出。
当安装程序结束后,先将SupportDir清理,然后再清理安装临时目录。
UI设计界面。在工程中,窗口界面显示和逻辑代码是分离的。该界面控制的是显示部分。
系统自带了多个默认样式的窗口,每个窗口对应有默认的脚本方法。当需要使用某个功能窗口时,可以在该界面对默认样式进行编辑,改变窗口的显示。之后如果有需要,再修改对应的脚本,控制内部逻辑。
当系统窗口无法满足我们的应用需求时,可以进行窗口的自定义,并为之创建对应的脚本方法,用于实现自定义的功能需求。可以从零开始,直接新建窗口,也可以对系统窗口进行克隆,作为基础。
无论是编辑过的系统窗口,还是自定义窗口,都支持导出导入的功能。通过导入导出,减少部分样式的迁移。需要注意的,这里的导入导出,改变的只有显示部分,并不涉及逻辑代码。在导入过程中,有可能还会出现资源覆盖的情况,需要谨慎处理。
由于dialog中使用的资源(文字和控件),都是通过id进行标识的,id一般也是系统通过固定格式自动生成的,所以也可以通过自定义id来规避资源覆盖的情况。dialog中使用的图片资源,都是以位图的方式来使用的,对bmp格式的图片支持得比较好,推荐使用bmp格式图片。
支持设定窗口的皮肤,系统自带了6种样式的皮肤可供选择。installshield提供了皮肤制作的软件,由于未对其进行了解,暂不展开相关话题。
皮肤的选择切换,并不会影响设计窗口的显示样式,而是在构建之后进行显示。
我们推断一下皮肤应用的流程。系统窗口中存在系统指定ID的控件作为基础控件,构建过程中,对基础控件的样式资源进行替换,达到更改窗口显示样式的效果。根据此推断,我们在编辑窗口的过程中,不要对默认控件的ID进行变更,并将自定义的控件和系统控件区分开(通过ID命令)。
字符串资源编辑器。
目录链接管理。该界面管理了工程中所用的目录链接。通过类型可以分为以下四种。
工程中不能识别相对路径,只能依赖于已有的路径变量进行拼接。可以通过<变量名>获取对应的路径,来进行路径组合。
升级设置。只有msi相关的工程由类似功能,因为这个功能是依托于Windows Installer的。
目前对该功能没有进行足够的测试,只做简单的介绍,不做详解。
[先参看code值相关内容](# code值作用)
升级方式可分为Major、Minor和Small三种。简单来区分,major方式,需要更改产品编号;minor方式,不需要改变产品编号,需要更改版本信息;small方式不需要更改产品编号和版本信息。
所以每次构建后,对安装过之前构建的安装包的客户机,都可以看作是Small方式的更新,会触发安装更新的过程。为了避免这样的情况出现,一般我们会禁用更新,安装时会提示已安装对应的产品。
对当前的工程进行编译,形成安装文件。关于编译的操作设置,之后单独来讲,这里不展开说明。[参见编译章节](# 编译)
默认编译配置为Product Configuration 1\Release 1,可以通过修改配置名和编译名来修改对应生成的路径。
对工程内表资源的直接编辑器。安装工程中的信息,都是通过表记录的方式存储的,可以通过该界面对相应的表格直接进行编辑。在编辑过程中要注意表之间的关联关系,否则容易出现修改内容不能成功应用或引起工程错误。
关于API的详解,请参照帮助文档相关内容。
介绍脚本处理中一些技巧。
利用SYSINFO结构体,能够获取安装机器的相关信息,可用来做一些条件校验。例如:
//采用64位注册表
REGDB_OPTIONS = REGDB_OPTIONS | REGDB_OPTION_WOW64_64KEY;
//恢复32位注册表
REGDB_OPTIONS = REGDB_OPTIONS & ~REGDB_OPTION_WOW64_64KEY;
Dialog Source
窗口行为是通过循环获取对应的消息来实现的。通过WaitOnDialog方法,等待窗体内的控件的消息返回,根据控件id来判断相关操作。
LaunchAppAndWait方法,可以通过winapi调用外部程序,可以对调用行为进行设置。但该方法不能和程序进行交互,只能获取程序的返回值。
通过调用SetStatusWindow,可以设置进度条的信息和状态文字。
目前只讨论共性触发事件,脚本功能可供使用的事件会更多。
OnCanceling
点击取消后,弹出提示框,进入完成窗体
OnFirstUIAfter
初次安装过程结束,进入完成窗体
OnFirstUIBefore
初次安装过程,界面流程
OnInstallingFile
单个文件安装时,可以设置自定义状态信息
OnMaintUIAfter
维护过程结束,进入完成窗体
OnMaintUIBefore
维护过程开始前,可以更改维护选项界面
OnAbrt
当进行抛出操作时,所进入的事件
准备相关的安装资源,包括软件程序、图片、文档等,按目录组织好,尽可能分好类别。
构建出对应的feature、component结构。通过feature的划分,划分出功能分块,用于和用户进行交互,各个feature之间相互独立,最少包含一个feature。component应代表一组有共性的文件,和对应的feature进行关联。
将各种资源和component进行关联,根据用途放置到合适的目录中。例如UI交互过程中使用的资源,放置到supportdir中,软件程序放置到installdir中,配置文件放置到个人目录中。
根据需求,设计UI交互界面。
在脚本事件中,控制界面交互的流程。界面交互流程涉及到初始安装和维护两部分,初始安装前对应OnFirstUIBefore事件,维护安装前对应OnMaintUIBefore事件,初始安装结束对应OnFirstUIAfter事件,维护安装结束对应OnMaintUIAfter事件。
根据实际需求,编写脚本处理安装过程。
设置相关的编译参数。介绍几个目前较为常用的设置。
安装包构建完之后,可以对install script进行代码级的调试。支持断点、变量监控、