1、前言2001-01-18 addingyesky在 DOS 时代,人们不会忘记,想要制作一个应用程序的安装往往是通过批处理文件来实现的,这种风格的安装程序常常令人们乐此不疲。直到 UCDOS 图形安装界面的出现,才让人感到一些新意,并为之一振。然而不久,具有易学易用的图形用户界面、多任务功能的 Windows 系统出现了,并大有取代 DOS 的趋势。直到 Windows 95 的问世,才使得DOS 真正变为过去,成为 PC 机上最流行的操作环境,并且随着 Windows 98 与 Internet Explorer 集成的新特性的引入,越来越多的程序员已开始致力于 Windows 应用程序的研
2、究与开发。同样,安装程序的运行环境也由原来的 DOS 变成了现在的 Windows 系统。安装一个软件或应用程序已不再仅仅是将相关的文件复制到硬盘中,而是必须允许用户按自己的愿望选择安装类型和安装路径,并且在不需要的时候,还要能够将安装的相关内容全部删除掉。这种 Windows 下的安装程序给人们留下了很深的印象,人们在惊叹 Office 2000 强大的安装功能和悦目的安装界面之后,已无法维持对 DOS 安装程序的留恋。InstallShield 恰恰是在这种操作系统不断发展的潮流中应运而生的,从 InstallShield3.0到 5.5,从普通的安装程序制作到最新的 Windows 安装
3、界面,InstallShield 公司已开发出基本各种操作平台和软件开发环境的 InstallShield 产品。InstallShield for Microsoft Visual C+6(简称 InstallShield VC 版 )和 InstallShield Express Custom Edition for C+ Builder 或Delphi(简称 InstallShield Express C+ Builder 或 Delphi 版 )就是其中用户较为熟悉的产品。由于 InstallShield 功能强大、灵活性好、完全可扩展以及具有强有力的网络支持,在各种安装程序开发工具中
4、脱颖而出,成为目前最为流行的制作安装程序的工具软件。而且,它所内建的脚本语言 InstallScript 使得用户可以像其他高级语言那样灵活地构造出自己的安装脚本程序来。正是因为这一点,InstallShield 已经成为目前制作安装程序的工业标准。用户所熟悉的 Visual Studio 98、Borland C+ Builder(Delphi)以及目前绝大多数的软件安装程序均是用 InstallShield 来制作的。由于 InstallShield 5.5 还支持 Visual Basic 6.0,故本教程以 InstallShield 5.5 专业版为主,并从应用出发,深入详实地讨论制
5、作一般应用类和数据库类安装程序的方法、技巧以及InstallScript 语言基础,且在 InstallShield 用户界面函数的基础上,挖掘其运用能力,最大地发挥 InstallShield 的定制和扩展潜能,构造出颇具创意、功能完善的安装界面来。本教程主要讲述 InstallShield 开发环境、InstallScript 脚本语言基础、基本安装程序的建立、安装界面的设计以及深入安装程序制作等共五章内容。各章内容并不停留在初学者的水平上,而且在制作安装程序的每个方面,都给出了更高、更深层次的方法,例如安装对话框的定制、使用自己的 DLL 库、操作注册表、安装界面的汉化、使用多媒体、反安
6、装以及安装程序的调试等。为了帮助读者充分掌握 InstallShield 特性,本书给出大量有用的实例,这些实例均以Ex_xxxx命名,并在 Windows 98、InstallShield 5.5 专业版本调试通过。由于在软件开发环境和操作系统未来发展的几年里,Windows 98/2000 以及VC+、C+ Builder、VB 等还仍将是主流。在这种契机下,适时地将 InstallShield 5.5 的使用方法和技巧奉献给大家,必将对广大的程序员、软件开发者和爱好者有所帮助。由于时间仓促,加之作者水平有限,不当之处在所难免,恳请读者批评指正。 感谢天极网及赵家雄、方舟先生,没有他们此教
7、程不可能在网上出版。感谢一直关心和支持此项工作的家人和朋友们,尤其是我的妻子。 集成开发环境概述2001-01-18 adding yesky在 Windows 95/98/NT 操作系统中正确安装了 InstallShield 5.5 专业版后,就可以单击任务栏的“开始“,选择“程序“ 中的“InstallShield 5.5 Professional Edition“,再选择该程序文件夹下的“InstallShield 5.5 Professional Edition“就能运行 InstallShield。第一次运行时,弹出如图1.1 所示的界面。但当利用 Project Wizard(项
8、目向导) 或其他工具创建一个安装项目后,就会出现InstallShield 5.5 的完整界面,如图 1.2 所示。它是由标题栏、菜单栏、工具栏、项目工作区窗口、文档窗口、输出窗口以及状态栏等组成的。标题栏是用来显示出当前窗口中的文件名,而且一般还有最小化 、最大化或 还原以及 关闭 按钮,单击 关闭 按钮将退出集成开发环境。菜单栏包含了集成开发环境中几乎所有的命令,它为用户提供了文档操作、安装脚本程序的编译、调试、窗口操作等一系列的功能。由于工具栏比菜单操作更为便捷,故常常将一些常用菜单命令也同时安排在工具栏上。项目工作区窗口包含用户安装项目的一些信息,包括文件组、组件、脚本文件、资源等。在
9、项目工作区窗口中的目录项或图标处单击鼠标右键,有时还会弹出相应的快捷菜单,它包含当前状态下的一些常用操作。文档窗口位于集成开发环境中的右边,脚本文件、资源文件以及安装程序所需要的各种资源等都可以通过该窗口显示出来。输出窗口出现在集成开发环境窗口的底部,它包含了 Build 和 Compile 两个页面,分别用来显示建立和编译过程中的相关信息。状态栏位于集成开发环境的最底部,它用来显示当前操作状态、说明、文本光标所在的行列号等信息。菜单栏和工具2001-01-17 addingyesky1.2.1 菜单栏在集成开发环境界面中,用户可以看到在它的上方排列着一系列的菜单,而每一个菜单下都有各自的菜单
10、命令。在进一步与集成开发环境打交道之前,先了解各项菜单命令的基本功能是很有必要的,因为大部分的操作都是通过菜单来完成的。InstallShield 5.5 的菜单栏中包含了 File(文件)、Edit(编辑)、View( 查看) 、Insert( 插入)、Project(项目)、Build(编译)、Tools( 工具)、Windows(窗口)以及 Help(帮助)等菜单。其中 File、Edit、View 、Windows 和 Help 均与一般 Windows 应用程序的菜单用法相同。这里仅对 Insert、Project、Build 和 Tools 菜单作简单说明。Insert 菜单Ins
11、ert 菜单中的命令主要用于项目及资源的创建和添加,它有三个菜单项: File into Script Files.、File into Setup Files.和 Links into File Groups.,分别表示将某个文件插入脚本文件和安装文件中以及链接到文件组中。一般情况,这三个菜单项是被禁用的。当切换到项目工作区窗口的“Scripts“页面并选定其中的脚本文件目录项时,菜单项“File into Scripts Files“被激活;当切换到项目工作区窗口的“Setup Files“页面并选定其中的目录项时,菜单项“Files into Setup Files“被激活;而当切换到项
12、目工作区窗口的“File Groups“页面并选中其中的“Links“目录项时,菜单项“Links into File Groups“被激活。Project 菜单Project 菜单中的命令主要用于项目的创建和相关内容的设置,它有三个菜单项:Project Wizard、Visual Basic Project Wizard和 Setting,分别用来创建一般安装项目、VB 应用程序安装项目以及项目相关内容的设置。Build 菜单Build 菜单中的命令主要用来进行安装程序的编译、连接、调试、运行等操作,它包括这样的菜单命令:Compile(编译) 、Run Setup(运行 )、Debug
13、Setup(调试)、Media(媒介)、Settings.( 设置调试和编译时的参数) 。Tools 菜单Tools 菜单中的命令主要是一些用于运行或定制开发环境中的实用工具,如图 1.3所示。值得一提的是,随着集成开发环境当前状态的改变,有些菜单中的菜单命令项还会随之变化。例如,当文档窗口没有任何脚本程序时,许多菜单项都是灰色的,用户不能使用它们。此外,InstallShiled 5.5 与其他 Windows 应用程序一样,其菜单系统一般都遵循下列一些相同的规则:(1) 打开 InstallShiled 5.5 的“File“ 菜单,会看到“Open“菜单项文本后有“ ,若选择该菜单命令,
14、则弹出通用文件“打开“ 对话框。因此,菜单文本后有 “就表示其执行结果是将弹出相应的对话框。(2) 在“File“菜单文本中,其中“F“ 字母带下划线。它表示该菜单项的助记符是“F“,当按住“Alt“键不放,再敲击该字母时,对应的菜单项就会被选中。(3) 在“Open“ 菜单文本后有 “Ctrl+O“字样,任何时候,先按下“Ctrl“健不放,然后再按“O“键就执行 “Open“菜单项命令,弹出通用文件“ 打开 “对话框。这表明“Ctrl+O“和该菜单项命令是一致的,“Ctrl+O“称为该菜单项的快捷键。1.2.2 工具栏尽管菜单命令可以完成各种操作,其相应的快捷键也可提高操作的效率。但是,菜单
15、命令的操作相对繁琐,快捷键又需要用户加以记忆,所以,有时候用起来还略嫌不便。而工具栏是一种图形化的操作界面,具有直观和快捷的特点,熟练掌握工具栏的使用后,工作效率将大有提高。工具栏是一系列工具按钮的组合。当鼠标指针停留在工具栏按钮的上面时,按钮凸起,主窗口底端的状态栏上显示出该按钮的一些提示信息,并且如果指针停留时间长一些,就会出现一个小的弹出式的“工具提示“ 窗口,显示出按钮的名称。工具栏上的按钮通常和一些菜单命令相对应,提供了一种执行经常使用的命令的快捷方法。同菜单中的菜单命令项相似,当菜单命令项禁止使用时,相应的工具按钮也是灰色的,用户不能使用它们。InstallShield 5.5 的
16、工具栏如图 1.4 所示。1.3.1 Scripts 页面项目工作区窗口的 Scripts 页面用来管理安装程序的脚本文件,在该页面中各项脚本文件均以树状列表的型式显示出来的。每个目录项前都有一个图标,且顶层目录项前还有一个套在方框中的符号“+“。双击顶层目录项或单击最前面的 “+“,则直接打开并显示该目录项的所有子项,此时顶层目录项前的“+“ 变成“-“号;再双击顶层目录项或单击最前面的“-“ ,则该项目的所有子项被收缩,只显示顶层目录项内容,此时顶层项目前的“-“又变成了原来的“+“ 号。展开顶层目录项的所有子项,双击以.rul 为扩展名的脚本文件项,则在开发环境的右边的文档窗口中显示出该
17、脚本文件的内容。为了增强安装程序代码的可读性,脚本文件的源代码内容往往是以不同颜色来显示的,各种颜色所代表的含义如下所示:白底黑字 一般文本黑底白字 被选定的文本青色底黑色字 文本的行标记白底红字 InstallShield 的函数白底蓝字 InstallScript 脚本语言的关键字白色底品红色字 常数白色底紫红色字 用“ 符号括起来的文本内容白底绿字 注释1.3.2 Components 页面项目工作区窗口的 Components 页面用来管理安装程序的各项组件。缺省时,一个安装项目通常有程序文件(Program Files)、示例文件(Example Files)、帮助文件(Help F
18、iles)以及共享的 DLL 文件(Shared DLLs)共四个组件。双击某个组件目录项,则在主界面的右边窗口中显示出该组件相关属性的完整列表,这些属性都可以方便地进行相应的修改。1.3.3 Setup Types 页面 项目工作区窗口的 Setup Types 页面用来管理提供给用户的安装类型。缺省时,一个安装项目通常有 Typical(典型)、 Compact(紧凑) 和 Custom(定制)共三种安装类型。双击某种安装类型,则在主界面的右边窗口中显示出该安装类型相关的组件。在组件中,凡是文件组前面有一个带钩号() 的图标,表示该文件组已被选入相应的安装类型中。反复双击文件组前面的图标可
19、在“选入“ 和“不选“之间进行切换。1.3.4 Setup Files 页面 项目工作区窗口的 Setup Files 页面用来管理在安装过程中所需要的安装文件,它通常有含有下面一些内容。(1) Splash Screen(启动画面)InstallShield 用 Setup.bmp 作为安装程序的启动画面。若在不同的语系(中文、English)中放置各自的位图文件,则安装程序将根据安装环境的不同语系选用相应的Setup.bmp;若将该文件放置在 Language Independent(与语系无关)目录项中,则不管操作系统是何种语系,都将以此位图文件作为程序安装的启动画面。(2) Langu
20、age Independent(与语系无关)它允许用户为各种操作系统或专门为 Windows 95/98/NT 操作系统指定相应的安装文件,这样不管怎样的语系,安装程序都会根据相应的操作系统来拣选相应的文件。(3) (3)其他语系相关的文件它允许用户为各种操作系统或专门为 Windows 95/98/NT 操作系统指定相应的安装文件,这样安装程序会根据相应的语系和语系下的操作系统来拣选相应的文件。(4) Advanced Files(高级文件 )在用具体的媒介发布时,允许用户在相应的媒介中放置一些非压缩文件。1.3.5 File Groups 页面 项目工作区窗口的 File Groups 页
21、面用来管理安装项目所需要的文件组。缺省时,安装程序项目通常有 Example Files(示例文件组) 、Help Files(帮助文件组)、Program DLLs(应用程序所需的 DLL 文件组)、Program Executable Files(应用程序文件组)以及 Shared DLLs(共享 DLL 文件组)共五个文件组。双击某个文件组,则在主界面的右边窗口中显示出该文件组的相关属性,用户可以方便地进行修改。1.3.6 Resources 页面 项目工作区窗口的 Resources 页面用来管理安装项目所需要的安装资源。缺省时,一个安装项目通常有 String Table(字符串表)
22、、Registry Entries(注册项)和 Shell Objects(外壳对象)共三种资源,其中 Shell Objects 资源是在 Windows 95/98 和 Windows NT 4.0 及其以后操作系统中创建被安装应用程序的程序文件夹(Folder 命令)、桌面图标或相应的快捷方式(Shortcut 命令)。1.3.7 Media 页面项目工作区窗口的 Media 页面用来管理程序发布时的媒介。在该页面中包含Media Build Wizard(媒介创建向导)、缺省的媒介以及用户新创建的媒介等项,单击“Media Build Wizard“将开始媒介创建向导,用来创建新的媒介
23、。需要说明的是:在各个页面中,右击鼠标时都会弹出相应的快捷菜单,它包含当前状态下的一些常用操作。 集成开发环境的初步实践2001-01-18 addingyesky前面介绍了关于集成开发环境的一些基本情况,这里以空类型的安装项目为例,进一步说明集成开发环境的使用过程。1.4.1 创建一个空的安装项目在 InstallShield 5.5 中,利用 Project Wizard(安装项目向导) 和安装项目模板可以创建 Windows 应用程序、数据库应用程序以及其他类型程序的安装项目。这里,我们首先对空类型的安装项目作简单说明,其他安装项目类型将在以后的章节中陆续介绍。一个空类型的安装项目包含了
24、一般安装项目的基本框架,只是安装脚本文件中没有相应的安装程序代码,因而不执行任何操作。创建一个空类型的安装项目的最大好处是可以帮助用户熟悉和掌握 InstallScript 语言的用法,并由此编制出简繁随意的安装程序来。在 InstallShield 5.5 中,想要创建一个空类型的安装项目,只需选择“File“菜单-“New“菜单命令,在 “New“对话框中选定“Blank Setup“,并单击确定按钮即可,如图1.5 所示。此时,InstallShield 5.5 自动为该安装项目命名为 “Blank Setup“,并定位到项目工作区窗口的 Scripts 页面,而且还在集成开发环境的右边
25、窗口中打开相应的脚本文件。1.4.2 添加代码 在空类型安装项目的脚本文件中,一开始是没有相应的安装程序内容的,它需要用户添加一些代码,例如:.program / 每个安装脚本程序都是以 program 开始SprintfBox(INFORMATION, “问候“, “%s“, “您好!“ ); / 消息对话框endprogram / 每个安装脚本程序都是以 endprogram 结束1.4.3 编译并运行 打开 Build 菜单,选择 Compile 菜单项或按快捷键 Ctrl+F7,系统开始对“Blank Setup“进行编译,同时在输出窗口中在线地显示出编译过程的情况,当出现Done -
26、 0 error(s), 0 warning(s)字样时,表示“Blank Setup“安装程序可以被运行了。在“Build“菜单中选取“Run Setup“菜单命令或按快捷键 Ctrl+F5,就可以运行“Blank Setup“安装项目。运行刚开始,出现“Setup“对话框,用来显示准备安装向导的进展情况,如图1.6。然后才执行前面添加的程序代码,其结果如图 1.7 所示。本章着重介绍了 InstallShield 5.5 的集成开发环境,并以空类型的安装项目为例简单地说明了安装脚本程序的添加、编译、运行的过程。下一章将讨论 InstallScript 脚本语言的基础内容。第 2 章 Ins
27、tallScript 脚本语言基础2001-01-19 addingyeskyInstallScript 是专门用来编写 InstallShield 安装程序的脚本语言。由于InstallScript 和 C 语言极为相似,因而使得 Visual C+用户编写安装脚本程序颇为得心应手。即使对于没有任何语言基础的用户来说,编写 InstallScript 程序也不会觉得无从下手,因为 InstallScript 程序结构是非常简单的。并且, InstallScript 为用户提供了超过 250 个的内部函数,从而使得用户不需要太多的代码就能编写出具有专业水准的安装程序来。2.1 InstallS
28、cript 程序结构同其他程序设计语言一样,InstallScript 脚本语言也有自己的程序结构。2.1.1 几个 InstallScript 程序下面先来看看几个比较简单的 InstallScript 程序。例 Ex_Hello 一个简单的 InstallScript 程序,用来弹出“问候“ 对话框。STRING szTitle;programszTitle = “问候“;SetDialogTitle (DLG_MSG_INFORMATION, szTitle);MessageBox(“您好!“, INFORMATION );endprogram程序中,program.endprogram
29、 构成主程序体,每一个 InstallScript 程序中都必须包含一个且只有一个这样的主程序体。在主程序体外,只能是变量定义、用户函数定义以及预处理指令等,而程序体内可以包括若干条语句,每一条语句都由分号“ ;“ 结束。本例中,SetDialogTitle 和 MessageBox 都是 InstallScript 的内部函数,它们分别用来设置对话框的标题和显示指定的信息文本,INFORMATION是一个系统预定义的常量,szTitle 变量是在程序体外定义的字符串变量。例 Ex_Func 自已定义一个函数,用来显示消息对话框。STRING szTitle; / 定义一个字符串变量proto
30、type MyMessage(STRING, STRING); / 自定义函数的声明programszTitle = “问候“;MyMessage(szTitle, “您好!“);endprogramfunction MyMessage(szTitle, szMessage) /* MyMessage 函数体 */beginSetDialogTitle (DLG_MSG_INFORMATION, szTitle);MessageBox(szMessage, INFORMATION );end;尽管本例的结果和 Ex_Hello 示例相同,但它使用了自定义函数MyMessage。 Install
31、Script 语言规定,一个自定义函数名必须在 program 关键字前面声明,而函数体代码的实现代码必须在 endprogram 后进行,且每个自定义的函数体都必须以 begin 开始 end 结束(注意 end 后要有分号“ ;“)。程序中的“/*.*/“ 之间的内容或“/“开始一直到行尾的内容是用来注释的,它的目的只是为了提高程序的可读性,对编译和运行并不起作用。正是因为这一点,注释的内容可以用汉字来表示,也可以用英文来说明,只要便于理解就行。例 Ex_Include 使用包含文件。#include “Sddialog.h“;STRING szTitle, szMsg, svDir;pr
32、ogramszTitle = “SdAskDestPath Example“;svDir = “C:EXAMPLETARGET“;szMsg = “; / 获取用户指定的安装路径if (SdAskDestPath(szTitle, szMsg, svDir, 0) = NEXT) thenTARGETDIR = svDir;endif;/ 显示用户指定的安装路径SprintfBox(INFORMATION, “SdAskDestPath“, “Successful.nnThe Target “ +“directory is: “ + TARGETDIR);endprogram#include
33、“Sddialog.rul“该程序是使用 Sd(Script Dialog,脚本对话框)对话框函数的一个示例。InstallScript语言规定,在调用 Sd 对话框函数时,需要在 program 前加上#include “Sddialog.h“语句,而在 endprogram 后加#include “Sddialog.rul“。与 C 语言相似,#include “Sddialog.h“和#include “Sddialog.rul“是 InstallScript 的编译指令,称为预处理指令。InstallScript 编译系统会根据预处理指令#include 中的文件名,把该文件的内容包含
34、进来。也就是说,实际程序的代码长度是在原来长度的基础上增加了 Sddialog.h 和 Sddialog.rul 文件的长度。程序中,SprintfBox 参数内容中的“n“ 是换行符,即在“Successful.“文本后回车换行。2.1.2 InstallScript 程序的基本组成 从上面的几个示例可以看出,一个 InstallScript 程序往往由预处理命令、函数、语句、变量以及注释等几个基本部分组成的。(1) 预处理命令在 InstallScript 程序的一开始经常出现含有以 “#“开头的命令,它们是预处理命令。InstallScript 提供了三类预处理命令:宏定义命令、文件包含
35、命令和条件编译命令。(2) 函数一个 InstallScript 程序是由若干个函数组成的。这些函数中,有的是 InstallScript系统中所提供的内部函数,有的是用户根据自己需要自己编制设计的函数(如例Ex_Func 中的 MyMessage)。(3) 语句语句是组成程序的基本单元,它可以是用来判断的条件语句,也可以是用来反复运行的循环语句等。这些语句是组成 InstallScript 程序中的最重要部分之一。(4) 变量大多数程序离不开变量。InstallScript 变量的类型比较简单,主要有数值型(NUMBER)、字符串型(STRING)以及链表型(LIST)等,例如例 Ex_He
36、llo 中的 szTitle 是一个 STRING 型变量。(5) 注释程序的目的不仅在于实现某种功能、解决某个问题,而且还在于数据结构和算法的交流。因此在程序中添加必要的注释是非常重要的,它能提高程序的可读性,帮助用户对程序的理解。需要说明的是,InstallScript 不支持控制台的输入和输出,数据的输入和输出是通过对话框进行的。2.1.3 InstallScript 程序的书写风格 尽管 InstallScript 语言比 C 或 C+语言容易理解,但对于初学者来说,一开始就养成良好的编程习惯仍然是非常重要和必要的。1. 标识符命名标识符是用来标识变量名、函数名、结构名、文件名等的有效
37、字符序列。标识符命名的好坏直接影响程序的可读性,例如 a1b1、c1d 虽然是合法的标识符,但却是不好的标识符,因为它不能让人理解它们所代表的含义。下面几个原则是命名时所必须注意的:(1) 合法性InstallScript 规定标识符由大小写字母、数字字符 (09)和下划线组成,且第一个字符必须为字母或下划线。任何标识符中都不能有空格、标点符号及其他字符,例如下面的标识符是不合法的:93Salary ,Youhe.Ding,$178,#5f68 ,r, =, =, != )逻辑运算符 ( LONG nValue;BOOL bDone;HWND hInstance;INT iStyle;LIST
38、 LISTINFO;programszName = “InstallShield“;nValue = 15;bDone = FALSE;hInstance = 0;iStyle = DLG_MSG_STANDARD|DLG_CENTERED;LISTINFO = ListCreate(STRINGLIST);.但是,InstallScript 不支持多重赋值运算,例如 a = b = c 相当于 C+的 a = b =c。也就是说,若 b 不等于 c,表达式为 a=0,若 b 和 c 相等,则表达式为 a=1。InstallScript 往往利用逻辑运算后的结果对程序进行判断、选取等控制。2.
39、3 逻辑运算和判断选取控制2.3.1 关系运算符关系运算是逻辑运算中比较简单的一种。所谓“关系运算“ 实际上是比较两个操作数是否符合给定的条件。若符合条件,则关系表达式的值为“ 真“ ,否则为“假“。在 InstallScript编译系统中,往往将“真“ 表示为 TRUE,将“ 假“表示为 FALSE。而任何不为 0 的数被认为是“ 真 “, 0 被认为是“假“ 。由于关系运算需要两个操作数,所以关系运算符都是双目运算符。 InstallScript 提供了下列 6 种关系运算符:(大于) ,=(大于等于),= ( 相等于),!=( 不等于)其中,前 4 种的优先级相同且高于后面的两种,但关系
40、运算符的优先级低于算术运算符。需要说明的是:(1) InstallScript 赋值运算符和等于的关系运算符使用同一个“=“符号。(2) InstallScript 不支持赋值和关系运算同在一个表达式中的情形。例如,下面的语句是不允许的:if (listID = ListCreate (NUMBERLIST) = LIST_NULL) then . . .endif;2.3.2 逻辑运算符逻辑运算符是用于将多个关系表达式或逻辑量(“真“或“假“)组成一个逻辑表达式。InstallScript 提供了下列 3 种逻辑运算符:! 逻辑非(单目)endif;只有当 endif;endif;2.3.3
41、 if 语句if 语句是用来判定所给定的条件是否满足,并根据判定的结果(“真“或“假“)决定执行给出的两种操作之一。InstallScript 提供了下列 5 种形式的 if 语句。(1) if-then 结构if-then 结构具有下列形式:if (条件表达式 ) then语句endif;当“条件表达式 “表达为“真“ 时,then 后面的语句才会被执行。一个“条件表达式“可以是一个布尔或整型常量、变量、产生布尔或整型结果的表达式以及能返回整型结果的函数。例如:if (szStringA = “exit“) thenAskYesNo ( “Are you sure you want to e
42、xit?“ , NO );endif;当字符串 szStringA 和“exit“相等时,函数 AskYesNo 才会被执行,否则跳过 if-then 结构,执行后面的语句。条件表达式两边的圆括号“( )“是可选的,但最好能使用,因为它能提高程序代码的可读性。(2) if-then-else 结构if-then-else 结构具有下列形式:if ( 条件表达式 ) then语句 1else语句 2endif;当“条件表达式 “表达为“真“时,执行 then 后面的语句 1,而当“条件表达式“表达为“ 假“时,执行语句 2。例如:if szStringA = “exit“ thenAskYesN
43、o (“Are you sure you want to exit?“ , NO ); / szStringA 等于“exit“时elseMessageBox (“Please wait. “, INFORMATION ); / szStringA 不等于“exit“时endif;(3) if-then-else 的嵌套结构在 if-then-else 语句中以包含一个或多个 if-then-else 语句称为 if-then-else 语句的嵌套。其一般形式如下:if ( 条件表达式 1) thenif (条件表达式 2) then语句 1 / 当条件表达式 2 为 TRUE 时执行else
44、语句 2 / 当条件表达式 2 为 FALSE 时执行endif;elseif ( 条件表达式 3) then语句 3 / 当条件表达式 3 为 TRUE 时执行else语句 4 / 当条件表达式 3 为 FALSE 时执行endif;endif;例如:if szStringA = “exit“ thenAskYesNo (“Are you sure you want to exit?“ , NO );elseif szStringA = “continue“ thenMessageBox (“Please wait.“, INFORMATION );elseUserErrorHandler;
45、endif;endif;当字符串 szStringA 和“exit“相等时,执行函数 AskYesNo;当 szStringA 和“continue“相等时,执行 MessageBox,而当 szStringA 等于其他值时,用户自定义的 UserErrorHandler函数被执行。(4) elseif 结构elseif 结构具有下列形式 :if (条件表达式 1) then语句 1elseif (条件表达式 2) then语句 2elseif (条件表达式 3) then语句 3.endif;例如:if szStringA = “exit“ thenAskYesNo (“Are you su
46、re you want to exit?“ , NO );elseif szStringA = “continue“ thenMessageBox (“Please wait.“, INFORMATION );elseif szStringA = “reboot“ thengoto StartHere;endif;.StartHere:.代码中,StartHere 是一个语句标号。当字符串 szStringA 和“exit“ 相等时,执行函数AskYesNo;若不相时等,则将 szStringA 和“continue“ 比较,相等时执行函数MessageBox;若不相等,再将 szString
47、A 和“reboot“ 比较,.。(5) if 和 goto 结构if 和 goto 的结构具有下列形式:if (条件表达式 ) goto 标号;当条件表达式为“真 “时,将流程转到“标号“所在的位置。这种形式最简单,例如:Name:AskText(“Company name:“, “, szSrc);if (szSrc = “) goto Name;一旦 szSrc 为空字符串时,就不停地要求用户输入相关内容。2.3.4 switch.endswitch 语句当程序有多个条件判断时,若使用 if 语句则可能使嵌套太多,降低了程序的可读性。开关语句 switch 能很好地解决这个问题,它具有下
48、列形式:switch ( 表达式 )case 常量 1 :语句 1case 常量 2 :语句 2.case 常量 n :语句 ndefault :语句 n+1 endswitch;当表达式的值与 case 中某个值相等时,就执行该 case 中“:“ 号后面的所有语句。若case 中所有的值都不等于表达式的值,则执行 default:后面的语句,若 default 不存在,则跳出 switch 结构。这里的表达式可以是一个常量、变量、算术表达式、逻辑表达式或一个有返回值的函数,但必须用圆括号“( )“括起来。case 后面只能是一个常数或常量名,不能为变量名、有返回值的函数名、字符串表涉及的字
49、符串名以及其他类型的表达式等。例如:STRING szMsg, svResult;NUMBER nvResult;programGetSystemInfo(VIDEO, nvResult, svResult); / 获得系统显卡类型switch (nvResult)case IS_UNKNOWN: szMsg = “用户显卡类型未知“;case IS_EGA : szMsg = “EGA 显卡“;case IS_VGA : szMsg = “VGA 显卡“;case IS_SVGA : szMsg = “Super VGA (800 x 600) 显卡“;case IS_XVGA : szMsg = “XVGA (1024 x 768) 显卡“;case IS_UVGA : szMsg = “分辨率大于 1024 x 768 的显卡“;default : szMsg = “错误“;endswitch;MessageBox(szMsg, INFORMATION);endprogram每次只有一个 case 语句块被执行,执行后,将跳出 switch 结构,执行 endswitch 后面的语句,这一点与 C 语言不同, Install