论坛风格切换切换到宽版
  • 6739阅读
  • 0回复

InstallShield Professional 7.0应用教程 [复制链接]

上一主题 下一主题
离线jeffcn
 
发帖
*
金钱
*
威望
*
只看楼主 倒序阅读 0 发表于: 2003-01-07
   InstallShield Professional 7.0应用教程
InstallShield Professional是由InstallShield公司开发的当今世界上最通用的软件安装制作工具,它提供了极为强大和全面的安装盘开发技术,已成为绝大多数商业软件安装盘制作的首选。与旧版本相比,InstallShield7.0采用了全新的集成开发环境(IDE),引入了新的对象概念,令制作符合软件业工业标准的安装盘更简单更轻松.。本文将介绍InstallShield7.0专业版的使用方法和技巧,使您也能制作出漂亮专业的安装盘。
第一章 InstallShield7.0 简介
InstallShield7.0提供了功能完善的集成开发环境(IDE),它通过一个MDI风格的主窗口集成了主菜单、工具栏、状态栏、工程工作区、输出窗口、辅助窗口、弹出式菜单等多个子环境(^60090911a^1)。
下面我们对其中的重要部分作详细介绍,便于您熟悉基本概念并掌握其使用方法。
一、主菜单与工具栏
菜单是IDE与使用者进行交互的重要环节,大多数主要操作均可通过主菜单及其下的各级子菜单完成。与常见的MDI窗口类似,在菜单下的工具栏中以图标的方式罗列了最常用的子菜单项。当鼠标移至工具栏某图标上并稍作停留时,会在鼠标下方出现黄色的微帮助,同时在窗口下部的状态栏中出现有关该图标所代表子菜单项的详细说明。
1.文件(File)菜单
文件菜单主要用于对工程文件进行管理,包括新建、打开、关闭、保存、另存为、打印、打印设置、最近打开的工程列表、退出等菜单项。
^60090911b^
2.编辑(Edit)菜单
编辑菜单主要用于对文件尤其是脚本窗口中文件的编辑,如复制、粘贴、替换等,其命令都符合Windows习惯。
^60090911c^
3.视图(View)菜单
视图菜单提供了对工作环境的管理,在菜单项中列出了Toolbar(工具栏)、Status Bar(状态栏)、Project Workspace(工程工作区)、Output(输出窗口)等四个工作环境区,用户通过在菜单项前打勾选取以决定是否显示该环境。其中Toolbar(工具栏)中又包括Standard(标准)工具栏、Build(创建)工具栏、Tools(工具)工具栏和Scripts(脚本)工具栏四项。这里值得说明的是Scripts(脚本)工具栏:(^60090911d^2)
Scripts(脚本)工具栏由两个下拉列表框和一个黄色的图标组成,用于方便用户对setup脚本文件的编辑。左边的下拉列表框中显示的是事件种类列表,包括移动数据前的事件、移动中的事件等五类。右边的列表框中则显示了指定种类中所包含的InstallShield事件列表。通过在setup脚本中对这些事件进行处理,用户可以更好地控制安装盘的制作。最右边的黄色图标名为“Insert InstallShield Function”,用于打开一个函数向导对话框,方便用户向脚本中插入函数。
4.去向(Go)菜单
去向菜单提供了与Project Workspace(工程工作区)相对应的工程环境管理方式,通过选择各菜单项,可以相应地切换到工作区的各个面板,并在辅助窗口中打开相应的画板、表单或编辑器窗口。具体的对应关系见下表:
^60090911e^
5.工程(Project)菜单
工程菜单主要用于对工程文件的管理,它提供了诸如:插入文件到文件组、导入setup文件、导入注册表文件等功能,使用户能利用和处理相关的工程文件和外部文件。
^60090911f^
6.创建(Build)菜单
创建菜单用于在安装工程基本完成时对其进行编译、测试并生成安装盘。
^60090911g^
7.依赖性(Dependencies)菜单
提供了对文件与语种、操作平台等依赖关系的扫描管理。
8.工具(Tools)菜单
工具菜单提供了资源管理器、对话框样板、Cab文件浏览器、Log文件浏览器、对象管理器等工具,方便用户在创建安装盘时的使用。
^60090911h^
9.在线(Online)菜单
提供了与InstallShield公司网站以及新闻组等各种技术支持的链接。
10.窗口(Windows)菜单
用于整理使用界面,包括Cascade(层叠)、Tile(平铺)、Close All(全部关闭)等菜单项,完全符合Windows风格标准。
二、工作窗口
在InstallShield IDE中,包含主窗口、工程工作区、辅助窗口、输出窗口等多种工作窗口。打开一个工程后,首先出现的便是主窗口,在主窗口的左边是所打开工程的工作区,上部是主菜单和工具栏,下部是输出窗口,右边的灰色区域则用于显示各种辅助窗口(图1)。我们的大多数工作正是在工程工作区和辅助窗口中完成的。
参照图1,可看到在工程工作区下部有一个标签形式的两层面板,面板中的每一页都对应着右边的一个辅助窗口,控制着安装盘制作的某个方面:
^60090911i^
在InstallShield的各个工作区、窗口上单击鼠标右键,会发现丰富的弹出式菜单。 这些菜单往往是与当前操作有关的选项和命令,熟练掌握可以大大提高工作效率。下表给出了常用的弹出式菜单供读者速查:
弹出式菜单一览表
^60090911j^
第二章 使用InstallShield安装工程向导制作安装盘
在对组织安装盘的各个步骤进行学习以前,为了更好地了解制作安装程序的思路,明了一些常用的基本概念,让我们先来掌握一点软件安装机制的基础知识。
组织软件安装的过程,说到底就是把需要安装的文件进行归类整理、压缩打包后通过用户定义等一定的交互手段有选择地传送到指定系统中,并对系统自动进行相应配置以满足程序运行需要的过程。显然,安装过程所处理的最基础的单元是文件。在制作安装程序时,我们先要将被安装的文件按其不同的特性进行归类,如:系统可执行文件、动态链接库、帮助文件等,从而将这些文件分为不同的文件组(File Groups)。在划分好文件组后,根据需要又可将文件组分别组织成独立的安装模块──部件(Component)或子部件,在安装时通过安装类型的设置供用户自由选择。例如,在安装Windows98时,“游戏”便是一个部件,在它下面又有“扫雷”等多个子部件,而每个子部件下都包含一个或多个文件组,其中链接了所有与该部件相关的文件。在上一章里,我们已经接触到了这样一些概念:文件组、部件、安装类型等,它们正是安装程序的核心内容。InstallShield允许你在制作安装盘时将安装过程中使用的文件、文件组、部件、安装类型以模块化的方式自由设计,先把文件分配到各个文件组中,再将文件组链接至部件或子部件上,最后对不同的安装类型关联不同的部件,从而完成整个安装程序的组织工作。
InstallShield7.0中提供了多个功能强大的向导,下面将介绍如何使用Project Wizard(安装工程向导)等向导工具快速制作安装盘。首先组织好需要制作成安装盘的有关文件,并对整个安装程序包括几种安装类型、每个安装类型下包括那些部件、部件下链接哪几个文件组以及文件组的分类标准了然于胸。接下来就一步步跟我来吧!
(1)启动InstallShield7.0,在New Projects(新建工程)窗口中双击Setup Project Wizard 图标,启动安装工程向导。首先出现的是Project Information(工程信息)窗口,在该窗口中可以定义要制作的安装程序的基本信息,包括:
^60090911k^
C:WINDOWSNotepad.exe或其他可执行文件。
这些信息将被存储在一个字符串表中,在运行工程时,字符串表中的字符串会为安装程序所显示并用于写入Windows注册表。平时这些字符串表可以从InstallShield的IDE环境中的Resource面板访问。
(2)完成基本信息设置后单击“下一步”,进入Maintenance Options(维护选项)窗口。在此可以指定在同一系统上进行多次安装时的默认处理,包括:
^60090911l^
(3)完成维护选项设置后单击“下一步”,进入InstallShield Update Service(InstallShield升级服务)窗口。在此可以指定该工程是否使用InstallShield升级服务。设置完成后单击“下一步”按钮。
(4)接下来进入Setup Languages(语种选择)窗口,其中列出了所能选择的供安装盘使用的语种。这里我们选择简体中文Chinese(Simplified),当然也可以选择其他语种。设置完成后单击“下一步”按钮。
(5)接下来进入Components(部件)窗口,在这里可以创建安装程序所需要的部件。第一次进入该窗口时(我们说第一次是因为你还可以在进入下一步骤后通过单击“上一步”按钮返回部件窗口进行修改),窗口中显示了一个典型的安装程序一般所需要的部件列表。向导中给出的有Main App(主应用部件)、Tutorial(教程部件)和Examples(例程部件)。当然你完全可以随自己的心意对其进行增删或重命名,只要选中一个部件并选择部件列表下的Add(添加)、Rename(重命名)或Delete(删除)按钮即可,也在其上单击右键利用弹出菜单完成上述工作。本例中因为要安装的只有notepad.exe一个可执行文件,故删除Tutorial(教程部件)和Examples(例程部件),并将Main App重命名为“主应用程序”。设置完成后单击“下一步”按钮。
(6)接下来进入File Groups(文件组)窗口,在这里可以定义和创建安装程序所需要的文件组。文件组由特点相似的文件组成,这些特点可以是文件的不同目的或功能,如是否都是共享文件、是否需要加锁、是否压缩、采用何种操作系统或语种等。在制作安装盘前要对文件组的划分进行充分的考虑,合理设计。第一次进入该面板时,面板中显示了一个典型的安装程序一般所需要的文件组列表。与上一步类似,我们只保留App Executables文件组并将其重命名为“可执行文件组”。在窗口的右部有一个文件组属性框,其中“Destination Folder”(目标文件夹)一项指定了文件组安装到目标系统中的位置。其默认值根据不同的文件组也是不同的。比如,一些系统Dll文件可能需要安装到WindowsSystem目录下。对自己定制的文件组,其默认值均为,这是一个系统变量,其值可以在脚本文件中赋予,也可以在后面的操作中指定目标文件夹后由系统自动赋值。你也可以根据需要单击其后的文件夹按钮打开一个目标文件夹设置对话框指定。另外两个属性指定了文件组是否是自注册文件组或共享文件组。当你需要安装一些要注册的OLE控件时要选中自注册属性。而如果是一个Dll文件组,并且可为其他应用程序使用,应选中其共享属性。本例中我
们不作改变。设置完成后单击“下一步”按钮。
(7)接下来进入Application Files(应用文件)窗口,为设定的文件组分配文件。
打开资源管理器,在Windows文件夹下找到notepad.exe文件,直接拖到文件列表中;
单击Add按钮,打开一个“打开”对话框,选择Windows文件夹下的notepad.exe文件,单击“打开”按钮。
如果有多个文件组,要从“Select File Group:”列表框中逐个选择文件组完成文件分配。文件分配完成后单击“下一步”按钮。
接下来进入Setup Design(安装设计)窗口,在这里将设定的文件组与部件相关联。在窗口右部是文件组列表,从中选中文件组后单击Add按钮即可添加至左部已激活的部件下。如果要移除某个文件夹,则从左部的面板中选中该文件夹并单击Remove按钮。单击“下一步”按钮继续。
(8)接下来进入InstallShield Objects(InstallShield对象)窗口。通过使用InstallShield对象可以让你轻松安装ODBC、BDE等许多通用第三方组件。在窗口中选取安装工程中需要包含的InstallShield对象插入对应的部件,选取方法类似于上一步骤。如果选中的对象需要作附加的设置,会在单击Add按钮后出现该对象的配置向导。若需要查看对象的详细信息,可以单击Object Gallery(对象集)按钮。本例中我们不需要插入任何对象,单击“下一步”按钮继续。
(9)接下来进入Create Shortcuts and Program Folders(创建桌面快捷方式和程序文件夹)窗口,实现在Windows“开始”菜单中放置应用程序运行命令和图标的功能。
在窗口左部的Shell Objects树形控件中选择Programs文件夹。
单击Add Shortcut按钮,Shell Objects树形控件中出现一个新的快捷方式,并且光标停留在快捷方式名称中供你进行编辑。
输入新的快捷方式名称“模拟安装—写字板”。
在窗口右部的快捷方式属性下Target编辑框中加入“Notepad.exe”。现在编辑框中的文本为 notepad.exe
类似上述步骤在Desktop文件夹下加入新的桌面快捷方式“模拟安装—写字板”,并设定其属性。
在快捷方式属性下还有一个Icon Index(图标索引)属性。这个值决定了最终用户看到的是第几号图标。图标索引号是从0开始的,也就是说,如果索引号为1,显示的将是第二号图标,依此类推。如果你使用的不是一个Windows图标,选择0。
单击“下一步”继续。
(10)接下来进入Dialogs Boxes(对话框)窗口。在此可以选择在安装过程中需要用到的供用户进行交互式操作的对话框。不妨回顾一下前面提到过的InstallShield的安装步骤,所有的安装窗口正是在这里设定的。在选中一个对话框后,会在窗口右部出现该对话框的图象供你预览,并通过在对话框前的复选框内打勾以确定将它选入你的安装程序中。Dialogs Boxes窗口中提供了十种常用的标准对话框(下表对它们做了详细介绍)。在选择了要调用的常用对话框后,InstallShield会将对应的函数调用自动加入脚本文件中。在InstallShield中还提供了其他大量的对话框,你可以通过在脚本文件中调用函数调用它们,还可以制作自己的对话框。本例中我们只选择Welcome Message和Destination Location两个对话框。单击“下一步”继续。
^60090911m^
其中,在软件许可协议对话框中显示的许可协议是系统默认的国际标准的协议文件,你可以以文本文件格式定义自己的许可协议文件,并在制作安装盘过程中以其替换Setup Files面板中Language IndependentOperating System Independent 文件夹中的License.txt文件。但要注意,文本中每行最多只能包含1024个字符(32位平台下,如果是16位平台下只能含512个字符)。
(11)当以上步骤都执行完毕后,向导现在显示Project Summary(工程概要)窗口,列出了前面设置的安装工程的总体信息供你作最后检查,如果你在浏览过程中发现有需要调整之处,可以通过“上一步”按钮逐步退回并作更正。否则单击“完成”,InstallShield将自动生成工程的相关文件,并在IDE中打开刚才创建的工程。
(12)在由向导创建了工程文件之后,对工程的控制就主要通过对脚本文件的修改来完成。在这里,我们给出改变安装程序的窗口标题栏文本字体这样一个示例,以此使你熟悉修改脚本文件的基本方法。
单击工程工作区中的Scripts面板,并定位在Functions(函数)项下,双击OnFirstUIBefore子项,此时在右边的脚本编辑器中光标将移至OnFirstUIBefore函数块的开始部分。
说明:在使用向导生成安装工程后,脚本文件中自动包含了5个函数块,分别处理不同的安装事件。其中OnFirstUIBefore函数块用于处理在第一次安装应用时安装部件前所要完成的任务。一般在这里进行下列设置:
* 设置屏幕
* 显示欢迎信息、软件协议书或关于软件安装的其他说明信息
* 从用户处获取信息,如注册信息、安装的目标位置、安装类型等
删除Begin下第二行至第六行的代码前的注释符“//”,在第二个SetTitle行尾按回车键,插入一个空白的新行。
选择主菜单Project菜单项下的Insert InstallScript Function子项(或直接单击工具栏上对应的图标),打开函数向导Function Wizard。
在Function列表中选择“User Interface”,此时在Function Name列表中出现的都是用于控制用户界面的相关函数,选择SetFont函数,该函数用于设置背景窗口中的标题栏文本字体。完成后单击“下一步”继续。(为方便查找函数,InstallShield Function Wizard将所有的内建函数按不同的用途分类。先在Function列表中中选择一个函数所属的类别可以大大提高查找速度。如果你不知道这个函数属于哪一类,可以在Function列表中中选择All。)
进入Fuction Wizard向导的第二步。在这里为SetFont函数设置运行参数。此时nFontStyle参数的值为STYLE_NORMAL,点击其后的下拉箭头,从下拉列表中选择STYLE_ITALIC。
在szFontName属性后的编辑框中输入“Courier”。
单击“完成”关闭向导返回脚本文件。此时一个SetFont函数行已被插入到原来的空行中。
从Build菜单中选择Compile菜单项对脚本文件进行编译。
从File菜单中选择Save菜单项保存修改过的工程。
(13)下面,我们使用媒介向导Media Wizard为准备好的工程创建磁盘映像,同时指定语言环境和操作平台。
从Build菜单中选择Media Wizard,打开媒介向导。
进入Media Name(媒介名称)面板,在New Media编辑框中输入文本“软盘安装”。单击“下一步”。
进入Media Type(媒介类型)面板,这里可以选择发布媒介的磁盘映像的大小。InstallShield7.0中提供了12种媒介类型,如下表所示:
^60090911n^
本例中我们选择3.5'' Diskette - 1.44MB。单击“下一步”。
进入General Options面板,在这里可以对磁盘映像的存放位置等选项作规定。默认的存放位置是<工程名称>Media<媒介名称>。例如,本例中的默认位置为“C:My InstallationssampleMedia软盘安装”。我们不作任何修改,直接单击“下一步”。
进入Components面板,选择要包含在媒介中的部件。默认为根据每个部件的“Include in Build”属性值决定其是否发布。本例中不作任何修改,直接单击“下一步”。
进入Media Layout(媒介规划)面板,指定哪些文件被存放在压缩包中,哪些文件被存放在CD—ROM文件夹中。默认为所有文件都存放在压缩包中。本例中不作任何修改,直接单击“下一步”。
进入Media Platforms(媒介平台)面板,指定媒介所支持的操作平台。这些指定将决定运行于哪些平台的文件组和安装文件被包含在媒介中。本例中选择Windows95、Windows98、Windows Me三项。单击“下一步”继续。
进入Media Languages(媒介语种)面板,指定媒介所支持的语种。这些指定将决定哪些与语种相关的文件组和安装文件被包含在媒介中。单击“下一步”继续。
进入Update面板,指定升级的相关信息。单击“下一步”继续。
进入Self-Extracting Package面板。当要创建一个自解压磁盘映像时,可以在此面板中对自解压文件名称、命令行、解压方式、文件密码以及是否显示欢迎对话框等进行设置。本例中不作任何设置,直接单击“下一步”。
进入Post-Build Options面板,用于进行将映像文件上传至某个FTP站点等设置。本例中不作任何设置,直接单击“下一步”。
进入Media Summary面板。在这里可以重温你前面所作的设定。如果需要调整,通过单击“上一步”退回到对应的面板进行修改。检查通过后单击“Build”按钮创建媒介。
(14)最后,试试看你刚完成的安装盘吧。在IDE中单击“Run Setup”图标,完成安装。若要卸载刚安装的模拟程序,从控制面板的“添加/删除程序”中选择“模拟安装盘演示程序”。
现在,你已经学会了快速制作安装盘的基本方法。如果你对安装的要求和功能还不满意,可以尝试利用前面介绍到的一些属性页和对话框对安装工程进行调整和修改,以求达到理想的效果。
第三章 使用InstallShield对象
在InstallShield5.x版本中,提供了一种简洁制作安装程序的办法:使用InstallShield模板创建安装程序。每个模板适用于一种开发工具或一种Windows技术(如ODBC、BDE、Directx等)。在模板中已经设置好了相关的安装类型、部件、文件组和安装文件,甚至包括安装脚本。你可以简单地通过修改模板工程使之适用于自己的需要。例如,对由PowerBuilder6开发的应用,可以使用PowerBuilder6模板创建一个安装工程,在其中对提供的安装类型等InstallShield数据进行取舍和修改,加入一些个性化的设置,再在安装脚本中修改代码使之完全符合自己的要求。
InstallShield模板的缺点表现在功能相对单一,不能同时在一个安装程序中便利地包含多种Windows技术。例如,如果一个安装程序中既需要用到Directx技术又需要安装ODBC,那么使用安装模板不但不会提高安装程序的制作效率,反而有可能引起开发者在选择核心部件时的困扰。
在InstallShield7.0中,模板已经为一个新的重要概念所代替:InstallShield对象。简单地说,InstallShield对象就是对制作某种类型安装盘所公用的文件和方法按照一定的组织顺序进行打包而得到的一个小插件。你可以在所有有需要的安装程序中调用对象,也可以将其分发给其他安装盘制作人员使用。对象的使用使安装程序的制作变得更简单。例如,你可以同时在一个安装程序中插入多个对象,从而将它们都包含到安装程序之中,而不必自己再去进行烦琐的设置工作了。在InstallShield7.0专业版中包含了以下对象:
^60090911o^
除此之外,也可以创建自己的对象供调用。
创建一个对象与创建一个标准的安装工程只有两点差别需要注意:
(1)对象中没有安装类型,只有部件、文件组和文件。
(2)创建对象时要注意它的范围。对象的范围大小决定了它的可用性。范围太小会让你感到不能满足需要。但范围过大又会让你觉得使用起来太笨重了。
要创建一个对象,从IDE中单击New菜单项,打开“New Project”对话框。从中选择Blank Object Project创建一个空白的对象工程,再对其进行设置和脚本编写。也可选择Object Wizard打开对象向导创建新的对象。创建好的对象会被加入到Object Gallery中等待调用。由于其创建过程与标准安装工程是类似的,这里就不介绍了,请读者自行尝试。
第四章 简介安装脚本语言InstallScriptScript
InstallShield的设计思想是让开发者不用编写一行脚本,仅仅通过使你的基于事件的安装程序执行其默认代码就可以创建一个安装盘。如果你想要对你的安装工程做更多修改的话,就需要手工编辑你的安装脚本。
安装脚本是一系列事件处理程序、被事件处理程序调用的函数以及为这些事件处理程序和函数所使用的数据的集合。这些脚本元素通过InstallScript语言,一种简单但又功能强大的安装程序制作语言得以表现。安装脚本可以通过以下三种方法创建:
(1)修改由Project Wizard为你生成的安装脚本。
(2)新建一个空白工程,手工编辑安装脚本。
(3)打开一个已有的工程脚本并进行修改。
在脚本编辑完成后,要对其进行编译。编译脚本的办法是在Build菜单下选择Compile菜单项。
当你创建一个安装工程后,InstallShield 会创建两个脚本文件:
(1)用于全局事件处理程序和异常处理程序的Setup.rul;
(2)用于部件事件处理程序的ComponentEvents.rul。
它们都位于你的工程文件夹的Script Files子文件夹下。
最初的时候,这两个文件都是空的。除非你从IDE中选中了这两个文件,InstallShield定义的默认事件处理程序是不会出现的。当你选中时,这些事件处理程序被插入到合适的脚本文件中去,并在IDE的Script面板中显示出来供编辑。
如果想修改ComponentEvents.rul中默认的部件事件处理程序的代码,必须在Setup.rul中使用下面的代码将所作的修改包含到你的安装中:
#include "ComponentEvents.rul"
一、 脚本文件的结构
每个安装脚本都包含声明和函数块。声明可以出现在函数块之前或是出现在一个函数语句与该函数的begin语句之间。InstallShield脚本一般具有如下结构形式:
// 常量定义,全局数据声明和函数声明
...
//函数块
...
1. 声明
所有安装脚本均以全局数据的声明开始。在这里,你可以定义常量、声明变量和声明一些全局函数。声明部分用来告知编译器后面的脚本中会用到哪些名称,同时在函数和其属性或值之间建立联系。当然,如果是内建函数,你就不必再对其加以声明了。
下面是一些常量、变量和函数声明的例子:
//常量定义:
#define PRODUCT "InstallShield"
#define LIMIT 100
//变量声明:
CHAR cVal;
NUMBER nVal;
STRING szName;
//函数声明:
prototype DisplayMsg (NUMBER, STRING);
prototype GetName (BYREF STRING);
(1)变量:
变量是一个命名了的数据项,其值在程序执行期间可能改变。变量必须按如下格式定义:
数据类型 变量名[, 变量名 [,...]];
一个变量名最多可以有32个字符。当要在一条声明语句中声明多个变量时,变量之间要用逗号加以分隔,声明要以分号结束。
下例中声明了7个变量,注意最后一个声明创建了3个数值型变量:
BOOL bValidEntry;
LONG lPopulation;
//限定了长度的字符串
STRING szUserName[128];
//未限定长度的字符串
STRING szMessage;
NUMBER nFileSize, nDirSize, nDiskSpace;
在说明字符串变量时,你可以自己选择是否指定字符串的长度。如果不指定,字符串变量会自动根据程序运行过程中赋给它的值决定长度。除非字符串变量需要被传递到一个外部函数(DLL)中,否则推荐让变量自动决定它的长度。字符串的最大长度是65534个字符。此外,InstallScript变量名和函数是对大小写敏感的。例如,svUsername和svUSERNAME是不一样的。
在InstallScript中,有一类特殊而又重要的变量:
* 系统变量
系统变量是一些预定义的字符串变量,它们包含一些有用的信息,比如源文件路径、目标路径、Windows路径、WindowsSystem路径等。系统变量不能在脚本中再去重新声明。当安装程序开始时,InstallShield会自动地初始化这些变量。一旦系统变量被初始化好了,你就能够使用和修改它们的值了。
^60090911p^
(2)常量:
常量是一个定义了值的数据项。InstallShield支持两种类型的常量:预定义常量和用户自定义常量。
* 预定义常量
预定义常量是由InstallShield预先定义好的一些常量值。在InstallShield中通常使用预定义常量来为用户自定义函数传入或返回指定的值。有经验的程序员都愿意使用预定义常量,而不是直接使用预定义常量所表示的值,因为这样可以大大提高程序的可读性。
预定义常量的值是不能修改的。但是你可以通过调用SprintfBox函数来了解某个预定义常量的值到底是什么。下面的例子就显示了预定义常量COMPONENT_FIELD_SELECTED的值:
SprintfBox(INFORMATION, "", "%d",COMPONENT_FIELD_SELECTED);
尽管你也可以直接使用预定义常量所表示的值,但我们还是强烈推荐你使用预定义常量,因为这样做往往一眼就能看出该常量的功能是什么。
* 自定义常量
自定义常量通过预处理语句#define声明,例如:
#define COMPANY_NAME "Example_Company"
#define MAXCOUNT 1000
注意常量名以大写字母开头。
2.函数块
在安装脚本中,函数块紧跟在关键字endprogram之后,所有用prototype声明过的函数都必须在函数块中定义。在函数块中可以附加一些全局变量,它们可以声明在函数块中所有函数体之间,但是声明在函数体内部的变量,仅在该函数体内可见。
3.标点符号规则:
和许多其他编程语言一样,InstallScript有自己特定的语法规则。如果你对C语言比较熟悉的话,InstallScript的语法规则将一目了然。即使你对编程语言一无所知,InstallScript的语法规则亦不难掌握。
在使用标点符号时要注意以下规则:
(1)大部分语句以“;”结束,这种要求也适用于那些独词语句,例如:end;,exit;,return;等等。
(2)预处理语句后面不带“;”,例如#define,#include等等。
(3)关键字program,endprogram和begin等要放在单独一行中,并且不带任何标点符号,同时,每个函数块的第一行也不带标点符号。
(4)在符号后面要使用冒号,例如:start:starthere:等等。
(5)用圆括号将参数表括起来。当参数表中有多个参数时,应用逗号将它们隔开。
有两种方法可以在字符串中插入双引号:其一,如果你用双引号作为字符串的起始标志,句中的双引号就必须用反斜线标志;其二,如果你用单引号作为字符串的起始标志,你就可以直接在字符串中使用双引号。举例如下:
//以下这两种声明方式都会在字符串中插入双引号
szQuote1 = "Who said, "Quitters never win"?";
szQuote2 = 'The same guy who said, "I quit. "';
要在字符串中插入单引号,也可以有类似的两种方法:用反斜线或者用双引号(注意:上面用的是单引号)。举例如下:
//以下这两种声明方式都会在字符串中插入单引号
szQuote1 = 'Who said, 'Nice guys finish last'?';
szQuote2 = "The same guy who said, 'I win.'";
与C或其他编程语言一样,在程序中适当地使用空白符可以提高程序的可读性。
二、操作符
InstallShield中包括以下操作符。
1.地址操作符
地址操作符由(&)表示,它是一个一元运算符,通过它能够得到脚本中任何一个变量在内存中的地址。使用时应注意,地址操作符必须放在变量名之前,而且中间没有空格。例如:
typedef DIMENSIONS
begin
SHORT sLength;
SHORT sWidth;
end;
DIMENSIONS rectangle;
DIMENSIONS POINTER pointerObject;
begin
pointerObject = &rectangle;
// . .
end;
2. 算术操作符
算术操作符是执行加、减、乘、除之类的算术运算的操作符。算术操作符分为一元操作符和二元操作符两类。一元操作符之后只接一个操作数,二元操作符需要连接两个操作数。在一个复杂的表达式中有可能包括两个甚至更多的算术操作符,这时先执行谁,后执行谁需要由操作符的优先级来决定。
3. 赋值操作符
赋值操作符由等号(=)表示,它用于将某个常量值、变量值、表达式结果或者函数返回值赋给另一个同类型的变量。下面是一个简单的示例:
STRING szName;
LIST LISTINFO;
szName = "InstallShield";
LISTINFO = ListCreate(STRINGLIST);
需要注意的是,如果你在声明一个字符串变量时,如果同时声明了该变量的长度,那么一定要保证在后面给变量赋值时不会超出这个长度。请看下面的例子,赋给变量的字符串总共有51个字符,因此变量szStringVarA和szStringVarB声明的长度至少应该是52,也就是说足以包含赋值的51个字符和一个自动添在字符串尾的空字符。
STRING szStringVarA[52], szStringVarB[52];
szStringVarA = "This is a sample string that is 51 characters long.";
szStringVarB = szStringVarA;
如果没有为字符串变量指定长度,那么InstallShield会自动为该变量开辟一个缓存空间,而且缓存的默认大小为256字节。在这种情况下,如果给该字符串变量赋值的长度超过了256字节(包括结尾的空字符),那么InstallShield将会自动地扩展缓存空间大小来接纳这个值。需要注意的是,在Windows3.1下不能超过512个字节,在Windows95和NT下不能超过1024个字节。
4.位操作符
位操作符(或者说按位操作符)可以让你精确地控制一个数值变量中的每一位。为了使位操作符使用起来更方便有效,你最好以二进制的形式来表达操作数。
位操作符使用起来和逻辑运算符感觉很相似,它们之间的不同之处在于:逻辑运算符是对表达式进行操作,而位操作符则是对一个一个的位进行操作。下表列出了InstallShield脚本编译器所支持的位操作符:
^60090911q^
InstallShield中的移动操作和C语言中的移动操作是一样的。当你将一个操作数向右移动2位时( >>2),那么最右边移出的2位将会被舍弃掉,其他各位均向右移动2位,同时左边空出的2位补0。
从执行结果看,移动操作实际上就是乘以或者除以2的某次幂。将一个数向左移动n位的效果等同于该数乘以2的n次幂。类似的,将一个数向右移动n位的效果等同于该数除以2的n次幂。
5.BYREF操作符
在默认情况下,用户自定义函数的参数是以参数值的形式被传递的,也就是说,传递给函数的是由每个参数指定的数据的复制品而非原始数据本身。当你想以引用方式向函数传递参数时,就需要用到BYREF操作符。例如:
prototype StrInvert( BYREF STRING );
BYREF操作符指明了该参数是以引用方式来传递的。也就是说,函数接收到的是实际的变量,当函数返回时,任何对该变量的修改都会为函数的调用者所见。
当用户自定义函数有不只一个参数时,需要对每个参数指定BYREF操作符。下例中,函数的第一个和第三个参数以引用方式传递,而第二个参数以值的形式传递:
prototype StrChangeChar( BYREF STRING, CHAR, BYREF BOOL);
注意:
(1)不能将用户自定义结构中的成员传递给由BYREF操作符修饰的参数。要想在用户自定义的函数中修改用户自定义的结构中的成员,你必须定义一个指向该结构的指针,然后在函数通过指针操作符(->)来操作结构中的成员。
(2)一个未限定长度的字符串变量在以引用方式传递到函数时将不会被调用它的函数自动限定大小。如果该函数试图给一个参数赋一个字符串长度大于该参数长度的值,会发生运行期错误401。要避免这种错误,对要以引用方式传递给函数的字符串声明指定的长度。
6.间接操作符(*)
间接操作符是一种一元操作符,通过它能够得到一个指针变量所指的内存区中所存放的内容。间接操作符必须放在指针变量名的前面,而且中间不能有空格。
在下面的例子中,nValue 是一个数值变量,pNumber指向数值的指针变量,赋值语句用于将pNumber指针所指向的内存区中的数值赋给nValue变量。
nValue = *pNumber;
间接操作符也可以用于向函数传递参数,此时函数将把指针变量所指向的内存区中的数值取出来作为函数的输入参数。请看下面的示例:
somefunction(*pNumber);
注意:
(1)间接操作符只能与数值型的指针一起使用。
(2)间接操作符不能用于为一个指定的内存区赋值。也就是说,间接操作符不能出现在一条赋值语句的左边,例如:
*pNumber = nValue; /* 这条语句是不会被编译的。*/
(3)当函数的参数由BYREF操作符定义时,不能用间接操作符来传递函数的参数。
(4)间接操作符不能用于声明一个指针。
(5)在声明函数时,间接操作符不能用于声明一个变量参数。
7.逻辑操作符
逻辑操作符允许你同时执行多个相关的查询,其返回值是TRUE(1)或者FALSE(0),通常和if、while语句一起使用。
^60090911r^
逻辑操作符的优先级比算术操作符和关系操作符的优先级要低。而在逻辑操作符中“与”操作符的优先级比“或”操作符的优先级要高。
8.成员操作符(.)
成员操作符用于对结构类型中的每一个成员进行引用。成员操作符必须出现在结构变量名和成员变量名之间,而且中间不能有空格。例如,
settings.bSwitchOn = FALSE;
表明将结构类型变量settings中的成员bSwitchOn赋值为FALSE。
9.关系操作符
关系操作符用于在一个条件描述语句(if、while等)中比较两个表达式。下表列出了InstallShield脚本编译器所支持的关系操作符。
^60090911s^
关系操作符的优先级比所有的算术操作符的优先级都低。而且在关系操作符之间,<、<=、>、>= 的优先级都高于 = 和 !=。
和C语言不同的是,InstallScript中的赋值操作符和关系操作符都用等号(=)来表示,而C语言中则以 = 表示赋值,= = 表示关系操作符。
注意:不能在同一个条件表达式中既使用赋值操作符又使用关系操作符。例如,下面的语句是不正确的:
if ((listID = ListCreate (NUMBERLIST)) = LIST_NULL) then
. . .
endif;
10.字符串操作符
字符串操作符允许直接对字符串进行操作,而不需要通过函数调用来进行。
字符串操作符是不分大小写的。
具体说来,InstallShield的脚本编译器支持以下几种字符串操作符:
(1)加入到路径(^):
该操作符用于将路径加入到路径描述或文件名描述中去。
当你想把两条路径或者一条路径和一个文件名连接到起时,可以使用加入路径(^)操作符。当把一个文件名或者一个子目录加入到路径中时,该操作符会自动检查是否有足够数量的反斜杠符号。如果你输入的是:
szStringVar = "C:MYPATH" ^ "YOURPATHFILENAME";
那么输出结果szString Var为:
C:MYPATHYOURPATHFILENAME
即使你在MYPATH后忘了加上反斜杠符号,如下所示:
szStringVar = "C:MYPATH" ^ "YOURPATHFILENAME";
输出结果仍然是合法的,因为InstallShield的 ^ 操作符已经自动地为你把反斜杠符号加上了。
(2)连接(+):
使用字符串连接操作符(+)能够将一个字符串连接到另一个字符串的结尾上,并得到一个新的字符串。在下面的示例中,两个字符串常量被连接起来,而且连接结果被赋值给字符串变量szThirdString,在这个表达式被执行之后,变量szThirdString的值是:“First string Second string”。
szThirdString= “First string ”+“Second string”;
连接操作符的操作元可以是直接给出的一个字符串值、字符串常量或者是字符串变量。
(3)查找字符串(%):
使用字符串操作符(%)可以确定一个字符串是否是另一个字符串的子串。下面的示例测试了字符串变量szStringVarA中是否包含子串“sample”。如果包含该子串,则调用MessageBox函数来显示一条提示信息。
szStringVarA = "这是一个例子";
if (szStringVarA % "例子") then
MessageBox("操作完成",INFORMATION);
endif;
字符串操作符是不区分大小写的。
11.结构指针操作符(->)
结构指针操作符能够以指针变量的形式来引用结构中的每个成员。结构指针操作符必须出现在指针变量名和成员名之间,而且中间不能有空格。例如:
typedef DIMENSIONS
begin
SHORT sLength;
SHORT sWidth;
end;
DIMENSIONS Table;
NUMBER nvNumValue;
DIMENSIONS POINTER pointerObject;
begin
pointerObject = &Table;
pointerObject->sLength = 500;
pointerObject->sWidth = 750;
要注意的是,在一个表达式中只能使用一个结构指针。
三、函数
InstallShield允许在脚本中使用三种类型的函数:
(1)内建函数,即由InstallShield本身提供的或者在标准对话框中包含的函数。
(2)你所创建的用户自定义函数。
(3)从动态链接库(DLL)中调用的函数。
注意:
(1)与C语言一样,InstallShield不支持函数嵌套。
(2)如果自定义的函数与某个内建函数重名,原有的内建函数将被覆盖。
1.内建函数
InstallShield有超过250个内建函数,你可以直接在安装脚本中直接使用它们。这些函数具有创建程序组(程序项),操纵文件夹和列表,监视安装状态,生成对话框等等很多功能。由于InstallShield脚本编译器内部已经预先声明了这些内建函数,所以使用时不必再由用户声明。
要正确使用内建函数,就必须知道它的函数名和它的格式。所有内建函数都被列于内建函数索引中。要想了解列表中某个函数的完整说明,只需点击它,在帮助主题中就会看到该函数的完整说明。
例如,AskYesNo是一个用来显示查寻对话框并等待用户以点击Yes或No按钮的形式来响应的内建函数,它的函数格式如下:
AskYesNo (szQuestion, nDefault);
和C语言相似,InstallScript也区分大小写。所以应该注意内建函数中字母的大小写。
在脚本中使用函数时,必须给函数传递正确的参数数目和参数类型。否则,脚本编译器将无法编译它。 当参数是字符串时,必须注意字符串应以单引号或双引号作为分界符,如"Please wait while files are transferred"或 'This is a string', 或 "C:MyfolderMyfile.ext".
举个例子说,假设想显示一个提问对话框(^60090911t^3),并且对话框以Yes为缺省项,则应如下调用内建函数AskYesNo:
AskYesNo ("Installation Complete. Would you like to view the ReadMe file now?", YES);
2.自定义函数
要创建和使用一个自定义函数,需要经过声明函数、构造函数、调用函数以及从函数返回一个值四个过程。
(1)声明函数:
创建一个用户自定义函数的第一步就是先声明这个函数。关键字的作用就是通知脚本编译器:这一行的代码中包含着一个函数定义。声明函数通常按以下步骤进行:
输入关键字prototype。
在关键字prototype后并且是同一行中输入返回类型,亦即由函数返回的值的数据类型。如果声明的类型与实际返回值的类型不匹配,脚本将不会进行编译。如果你没有清楚地声明一个返回类型,返回类型会被假设成NUMBER型的。
在同一行中数据类型后(如果有的话)输入函数名。
在函数名后面输入参数的数据类型列表,该列表必须用圆括号括起来,而且相互之间由逗号加以分隔。
如果函数不需要参数,则在函数名的右边写上一对空的圆括号即可。
在行尾以分号结束。
在下面的例子中,FunctionName是一个包含了三个参数的函数。在调用这个函数时,传入的参数依顺序分别为INT型、STRING型和SHORT型的。CopyBitmapExample是一个不带任何参数的函数,而FileTransfer则是一个有五个参数的函数,其中前三个参数是LONG型的,后两个参数是STRING型的。
prototype FunctionName (INT, STRING, SHORT);
prototype CopyBitmapExample ();
prototype FileTransfer (LONG, LONG, LONG, STRING, STRING);
当声明DLL中的函数时,要对DLL函数名使用.的声明格式。例如:
prototype MyDLL.MyFunction (INT, INT);
上面这个声明通知InstallShield编译器:程序将在一个名为Mydll.dll的动态链接库中调用一个名为MyFunction的函数,该函数有两个INT型的参数。
在声明一个DLL函数时,你还可以选择性地声明一个调用约定,既可以是cdecl也可以是stdcall,例如:
prototype cdecl MyDLL.MyFunction (INT, INT);
如果你没有清楚地指定一个调用约定,InstallShield会使用stdcall。如果你既声明了一个调用约定又声明了一个返回类型,要将调用约定放在返回类型的前面。
(2)构造函数:
在声明了函数原型之后,还需要在函数块中定义函数体本身。每一个函数块中只能包含一个函数,而且函数块的位置必须放在程序块的endprogram语句之后。记住:用户的自定义函数必须放在整个脚本的最后。下面是创建函数的步骤。
在函数体的开头写上关键字function,后面是返回类型,如果声明的类型与实际返回值的类型不匹配,脚本将不会进行编译。如果你没有清楚地声明一个返回类型,返回类型会被假设成NUMBER型的。
在返回类型后(如果有的话)输入函数名。
在函数名的右边写上你想在圆括号中使用的参数名。当然,这里的参数数据类型必须与声明函数原型时的参数的数据类型相一致。
步骤1到3创建了函数头,在InstallShield脚本中函数头并不要以分号结尾。
接下来,声明函数中需要用到的局部变量。再另起一行写上关键字begin,而且不加任何标点符号。
在begin行之后,写上完成函数功能所需要的代码。
可以通过return语句来为函数指定一个返回值。
在函数的最后一定要以关键字end结束。
下面是一个函数块的例子:
function GetPathParts(szFullPath, svDrv, svPath, svName)
LONG lResult;
begin
lResult = ParsePath(svDrv, szFullPath, DISK);
if (lResult = 0) then
lResult = ParsePath(svPath, szFullPath, DIRECTORY);
endif;
if (lResult = 0) then
lResult = ParsePath(svName, szFullPath, FILENAME);
endif;
return lResult;
end;
用户自定义函数能通过return语句返回一个LONG型的返回值,如果想返回其他类型的返回值,你可以通过由BYREF操作符指定的参数来实现。
(3)调用函数:
无论是用户自定义函数、内建函数、标准函数还是外部函数,它们的调用方法都是一样的。都是先写上函数名,然后是想传递到函数中的参数。例如:
MyFunction (MyAge, MyHeight, MyWeight);
(4)从函数返回值:
与InstallShield的内建函数和标准对话框函数一样,用户自定义函数也能为调用者返回一个数值。为此,必须使用Return语句。该语句必须放在函数的end语句之前。如果没有用return语句指定返回值,或者在return语句之后没有任何值,那么函数的返回值将是不可预知的。
return语句通常用于返回一个错误代码,用于指示该函数调用是成功还是失败。也用于那些对输入参数加以计算并返回计算结果。
关键字return后面能够接常量、变量、表达式或者函数调用。
如果函数想返回多个值,必须通过引用由BYREF操作符定义的参数来实现。
四、流控制语句
象大多数程序语言一样,InstallScript也是按顺序执行的。它也是从程序块的第一行开始,到最后一行为止。这种顺序执行的脚本也能够通过条件语句来产生分支和循环。“分支”最常见的情况是通过if语句来实现程序流向几种可能之一的方向执行下去。“循环”是对某段程序块重复执行一遍或多遍,通常是指定循环次数或者循环到某个条件满足为止。
为了控制脚本的执行流向,InstallShield提供了以下关键字。
^60090911u^
五、保留字
InstallScript中的保留字由内建函数、语言关键字、事件句柄、预定义常量、预处理指令和系统变量组成。其中内建函数、预定义常量和系统变量已在前面的章节中作了说明。下面介绍其余三类保留字:
1.语言关键字
语言关键字是指那些被InstallScript作为命令符的单词。它们在被InstallShield的脚本编译器解释之后,可以来执行某些动作,或者用来与其他元素一起组成脚本。一般情况下,无抡是什么理由,你都不要将它们重新定义成别的用途。下面是所有的语言关键字列表:
^60090911v^
2.事件句柄
事件句柄是响应安装过程中发生的事件的InstallScript函数。下面是所有的事件句柄保留字列表:
^60090911w^
3.预处理指令
预处理指令只有在InstallShield脚本编译器编译脚本时才被执行。
预处理指令能够告诉InstallShield脚本编译器在编译中去包含其他资源文件,去定义常量,去包含或者不包含某段脚本的代码,去判断某个编译时期条件是true还是false,还可以显示用户自定义的错误消息。InstallShield中的预处理指令和C语言中的预处理指令在表达方式上是非常相似的,但并不完全一致。
预处理指令以“#”开始,可以写在脚本中的任何地方。注意不要在预处理指令结尾处加分号。
InstallShield支持以下预处理指令:
^60090911x^
六、事件句柄
InstallShield安装程序是由一个以指定顺序产生一系列事件的软件引擎所驱动的。这些事件触发了执行安装指令的软件处理器。例如,一个安装程序被载入后,它马上生成一个称作Begin的事件,触发一个称作OnBegin的事件句柄的执行。这个句柄指定了当Begin事件发生时要执行的指令。安装过程中其他的事件则触发响应的其他句柄,这些句柄在一起完成了安装应用的整个工作。
InstallShield定义了三类事件句柄:
^60090911y^
当你创建一个工程时,InstallShield会自动生成一组默认的全局事件句柄。同样,当你在安装程序中添加部件时,InstallShield也会为该部件生成默认的事件句柄。你可以修改所有的事件句柄,但是要注意,如果你修改了ComponentEvents.rul中默认的部件事件句柄,你必须在Setup.rul中使用下面的代码引入所作的修改:
#include "ComponentEvents.rul"
第五章 对自注册文件和共享文件的安装
一、安装共享文件
所谓共享文件,指的是能被多个应用程序调用的文件。许多应用程序在安装时都在WindowsSystem目录下复制共享的.dll文件和.exe文件。这些文件一般被认为是Windows95或Windows NT的核心部件。InstallShield为共享文件的安装提供了一些特殊的方法。首选办法就是为一个文件组中的所有文件都设置共享属性。你也可以在打开SHAREDFILE选项后通过调用XCopyFile 或VerUpdateFile函数来进行安装共享文件(SHAREDFILE和LOCKEDFILE两个选项不能同时选中)。InstallShield会更新这些共享文件的引用次数记录。
InstallShield总是将共享文件默认为锁定文件。如果你正在传递一个带有SHAREDFILE选项的文件,那么你必须在后台为这些文件加锁。
例如,通过下面的VerUpdateFile函数调用:
VerUpdateFile(WINSYSDIR ^ "Kernel32.dll",
SHAREDFILE | VER_UPDATE_COND,
svInstalledFilePath);
可以将Kernel32.dll文件从源文件夹(SRCDIR)传递到WindowsSystem文件夹中。InstallShield会自动将该文件的引用次数加一。同样,程序卸载时会自动将该文件的引用次数减一。
二、安装自注册文件
自注册文件指的是需在注册表中进行注册后方能为应用程序所使用的文件,一般是一些OCX控件。安装自注册文件的首选办法是为一个文件组中的所有文件都设置自注册属性。你也可以在打开SELFREGISTER选项后通过调用XCopyFile 或VerUpdateFile函数来进行安装自注册文件(SELFREGISTER 属性总是和SHAREDFILE和属性一起使用,它们之间用或符号( | )连接)。
例如,下面的XCopyFile函数调用:
TARGETDIR = WINSYSDIR;
XCopyFile ("App32res.dll", "App32res.dll", SELFREGISTER | SHAREDFILE)
可以将App32res.dll文件从源文件夹(SRCDIR)传递到WindowsSystem文件夹中。InstallShield会立即注册该文件。同样,程序卸载时会自动删除该文件的注册信息。
第六章 设计用户安装界面
一、主安装界面
主安装界面即是最终用户所看到的安装界面,它决定了用户对应用程序的第一印象。
InstallShield的图形用户接口(GUI)为最终用户和安装程序之间的交互提供了最直接的方式。它在用户与安装程序之间建立了一个通用而稳定的交流渠道。InstallShield的GUI包括弹出窗口、消息框、对话框、图标、位图以及声音、视频剪辑等。
1. 用于设置主安装界面特征的函数
InstallShield中提供了许多用于处理主安装界面的函数,如下表所示:
^60090911z^
2.主安装界面设计的一些技巧
(1)使用户界面对象生效或失效:
可以通过在脚本中调用Enable或Disable函数使指定的用户界面对象可见或不可见。但要注意,每次调用Enable或Disable函数只能使一个用户界面对象生效或失效。例如,要使解说栏和进度显示器生效,需要如下代码:
Enable(BACKGROUNDCAPTION);
Enable(STATUS);
(2)设置背景色:
InstallShield为安装界面提供的默认背景色的RGB值为(0,128,128)。要改变主安装窗口的背景色,调用带BACKGROUND选项的SetColor函数。在第二个参数里你既可以指定一个预定义常量也可以指定一个RGB表达式。例如:
//将背景色置为黄色。
SetColor (BACKGROUND, RGB (255, 255, 0) );
如果想在安装一开始时就显示背景色,必须在调用Enable函数使背景生效或将主安装窗口设为全屏模式或窗口模式前就调用SetColor函数。
(3)设置背景图案:
平铺图案:
调用带有TILED选项的PlaceBitmap函数。例如:
szName = SUPPORTDIR ^ "TileImg.bmp";
PlaceBitmap (szName, nID, nDx, nDy, TILED);
上面的代码假定Setup Files面板中存放了位图文件TileImg.bmp并将其添加到系统变量SUPPORTDIR所包含的路径中去。
根据屏幕大小和主安装窗口的大小,位图有可能被截去右侧和下侧的一部分。最好是将图案拉伸以正好覆盖整个主安装窗口。
拉伸图案:
调用带有FULLSCREENSIZE选项的PlaceBitmap函数。例如:
szName = SUPPORTDIR ^ "FullScr.bmp";
PlaceBitmap (szName, 10, nDx, nDy, FULLSCREENSIZE);
FULLSCREENSIZE选项将图案拉伸以覆盖整个主安装窗口。根据屏幕分辨率的大小,该选项可以将一个很大的位图放到主窗口的中央,也可以将一个较小的位图充满整个窗口。
上面的代码假定Setup Files面板中存放了位图文件FullScr.bmp并可在运行时从系统变量SUPPORTDIR所包含的路径中进行访问。
(4)设置主窗口的标题:
主窗口标题的默认风格是Times New Roman、粗体、斜体并带阴影。可以通过SetFont函数设置字体类型以改变默认值。下面的代码将标题风格设为MS Sans Serif、粗体和阴影效果:
SetFont (FONT_TITLE, STYLE_BOLD | STYLE_SHADOW, "MS Sans Serif");
然后,调用SetTitle函数以设置标题文字、字体大小和颜色:
SetTitle ("欢迎进入安装!", 45, YELLOW);
目前InstallShield只支持将标题放置在窗口的左上角。但你可以在标题字符串之前使用空格以使字符串右移到需要的位置。你也可以使用新行标识符(n)将标题截断成多行显示。甚至你还可以放弃SetTitle函数,改用PlaceBitmap函数将一幅位图放到标题栏中去。
(5)将主窗口放在前端:
安装程序经常会调用其他的应用程序并把它们的窗口放在主安装窗口之前。你可以通过调用Windows API函数SetForegroundWindow将主窗口重新放回前端并激活。如下例所示:
HWND hMain;
NUMBER nReturn;
// Windows API 函数 SetForegroundWindow示例。
prototype User32.SetForegroundWindow(HWND);
begin
// 设定为窗口模式
Enable(DEFWINDOWMODE);
Enable(BACKGROUND);
// 运行一个会将一个窗口置于 InstallShield 安装窗口之上的应用程序。
MessageBox("Launch program.", INFORMATION);
LaunchApp("Notepad.exe", "");
// 取得主安装窗口的句柄。话框tallShield 。
hMain = GetWindowHandle(HWND_INSTALL);
// 将主安装窗口带回前台。
nReturn = SetForegroundWindow(hMain);
// 延迟5秒以显示效果。
Delay (5);
// 报告SetForegroundWindow 函数是否调用成功。
if (nReturn < 0) then
MessageBox("失败!", WARNING);
else
MessageBox("成功!", INFORMATION); endif;
end;
(6)在对话框和标题栏中显示特殊符号:
要想显示版权符号和注册商标符号,可以在按下ALT键的同时,在数字键盘上输入标识符。如下所示:
版权符号 © Alt+0169
商标符号 TM Alt+0153
注册商标 ® Alt+0174
(7)获取主安装窗口的句柄:
在脚本中有时需要获取主安装窗口的句柄以便对其进行控制。调用GetWindowHandle函数即可满足这一要求,如下所示:
hMain = GetWindowHandle (HWND_INSTALL);
(8)显示一幅启动画面:
在安装程序初始化时,你可以显示一幅自定义的启动画面对你的公司和产品进行宣传。
如果你在IDE中的Setup Files面板中的Splash ScreenLanguage Independent文件夹下存放了一个名为Setup.bmp的文件,InstallShield会将其作为启动画面自动地在屏幕正中显示出来。
你也可以在Splash Screen文件夹下的每个语言环境所对应的文件夹中分放不同的Setup.bmp文件,InstallShield会根据安装的语言环境显示正确的启动画面。
Setup.bmp可以是双色的、16色的或256色的位图。
二、设计背景和说明显示区界面
InstallShield还允许加入各种图形、说明显示区等丰富自己的安装界面,同时提示给用户更多有用的信息。
1.InstallShield支持的图象文件格式
在InstallShield中,你可以在安装工程中加入位图、说明显示区以及视频文件。InstallShield支持以下图形格式:
(1)16色、256色以及真彩(24位)色的.bmp位图文件。
(2)16色以及256色透明位图。
(3)可放置的Windows图元图象(.wmf文件)。
(4)AVI动画文件。
2.设置图形的透明效果
使用透明的位图可以使你将公司标志或类似的位图作为安装窗口的一个组成部分。最典型的用途是将一幅图,比如公司标志,作为安装界面的背景。你可以透过透过背景前端的字符看到这幅图。
要显示透明的位图,只需调用带BITMAPICON选项的PlaceBitmap函数即可。默认情况下,InstallShield使用RGB值为(128,0,128)的紫色为透明色。也可以通过PlaceBitmap函数的第一个参数(szName)来指定一个透明色。其方法是在位图名称后加上一个分号,然后写上作为透明色的RGB值。例如:
szName = SUPPORTDIR ^ "TransImage.bmp;255, 128, 64";
就通知了InstallShield当图片TransImage.bmp显示在安装窗口中时,将 RGB值所指定的颜色(黄色)作为透明色。SUPPORTDIR路径意味着位图存放在Setup Files面板中。
3.以特殊效果显示位图
调用SetDisplayEffect函数可以让你设置位图第一次显示在主安装窗口中时的特殊效果。在调用PlaceBitmap函数显示一幅位图之前,先要选择一个SetDisplayEffect's的选项:
^60090911a1^
4.移除一幅位图
当你要从安装窗口中移除一幅位图时,调用PlaceBitmap函数,将nCorner参数设为REMOVE。下例移除了Welcome.bmp文件:
szName = SUPPORTDIR ^ "Welcome.bmp";
PlaceBitmap(szName, 0, 0, 0, REMOVE);
记住及时移除不再需要的位图,否则不同的位图调用的系统调色板会造成干扰,也会降低安装的速度。甚至会让用户同时看到两幅位图。
5.根据目标系统分辨率放置位图
你的最终用户可能会使用不同大小和分辨率的显示屏幕。因此,在放置位图前先得到目标系统的分辨率不失为一个好主意。为了以像素点为单位得到屏幕的大小,可以如下调用GetExtents函数:
GetExtents(nDx, nDy);
该表达式将屏幕的宽度以像素点为单位返回到nDx参数中,而将高度同样以像素点为单位返回到nDy参数中。使用nDx和nDy变量,你可以将位图放到同样的相对位置中去,而不必考虑目标系统的分辨率。
随后可以通过调用PlaceBitmap函数指定显示位图的位置。PlaceBitmap函数需要被告知所指定的显示位置距离屏幕边缘的像素点数目。可以将GetExtents函数返回的nDx和nDy值传递过去,从而放置一个与屏幕分辨率无关的位图。参见下面的例子(假设Mybitmap.bmp文件已经被包含在IDE的Setup Files面板中了):
szBitmap = SUPPORTDIR ^ "Mybitmap.bmp";
PlaceBitmap(szBitmap, nID, nDx/5, nDy/4, UPPER_RIGHT);
图元图象文件和多媒体图象(但不含位图)可以通过调用SizeWindow函数重设大小。
6.改变标准对话框中显示的图形
要改变在标准对话框中显示的位图,需要调用带DLG_INFO_ALTIMAGE选项的DialogSetInfo函数以指定要显示在标准对话框中的位图文件。调用DialogSetInfo函数后,所有的标准对话框都会显示新的位图文件。
下例中,要根据GetSystemInfo函数的返回结果决定显示在SdFinish对话框中的位图。如果目标系统支持256色或更高的颜色,将显示一幅256色的位图ImgHiRes.bmp,否则显示一幅16色的位图ImgLoRes.bmp。两幅位图都存放在Setup Files面板中,并可通过SUPPORTDIR路径进行访问。
GetSystemInfo (COLORS, nvResult, svResult);
if nvResult >= 256 then
DialogSetInfo (DLG_INFO_ALTIMAGE,
SUPPORTDIR ^ "ImgHiRes.bmp", TRUE);
else
DialogSetInfo (DLG_INFO_ALTIMAGE,
SUPPORTDIR ^ "ImgLoRes.bmp", TRUE);
endif;
SdFinish (szTitle, szMsg1, szMsg2, szOpt1, szOpt2, bvOpt1, bvOpt2);
三、为安装程序加入多媒体效果
InstallShield提供了对多媒体效果的处理功能。使用多媒体效果可以使你的安装程序变得