现在你已经清楚如何打包应用程序了,包括决定采用何种模式,比如:公司内部应用软件、共享软件和商业软件。 还应该有一张所用到的全部文件的清单,并保证包括了每个文件安装所涉及的方方面面,例如:写出必须安装在SYSTEM目录下的文件。最后,应该在一台只装有Windows的机器上测试这些文件,直到通过之后,才能开始编写安装程序。
注释 本节内容以Visual C++6.0 的InstallShield为基础,老版本的Visual C++中的InstallShield版本太低,使用时必须修改某些过程才能满足需求,即使你所使用的InstallShield与本书所用的InstallShield版本相同,你所看到的屏幕显示和选项也会因所封装的程序不同而有所差异。简而言之,使用时看到的和叙述的有些差异无关大局。但必须安装InstallShield产品,它在Visual C++ 6.0 CD的Ishield目录下。我们假定你已装好了。
到目前为止,我们已向第2章建立的应用程序Sngl_Doc中加入了一个资源文件(第3章)和一个帮助文件(第15章),可以进行打包提交给用户了,它至少可以作为一个例子。下文给出了建立一个典型安装程序的步骤,这些没什么费解的,就是为了程序的发布。如果非要从中提取出一个模型,近似于我们前面提到的企业内部应用程序型的打包情况。
注 本节讲述完整的安装程序,但实际应用中必须进行修改以满足特定的程序和安装环境的需要。
1. 启动InstallShield 6 Free Edition程序。你会看到如图16.1所示的窗口,注意:事先并没有定义工程文件,但在Projects窗口中出现了一个安装向导,而且看上去不像Visual C++中的标准窗口,但随着工作的进行,你会发现它非常有助于安装程序的建立。同时请注意一下右下角的InstallShield 链接,单击将打开浏览器,打开Internet上的InstallShield在线帮助站点。

图16.1 InstallShield让你使用与Visual C++中创建应用程序所用技术相似的技术创建安装程序
2. 双击Projects 窗口的Project Wizard图标,你会看到如下图所示的ProjectWizard-Welcome对话框:

注 InstallShield 的Professional Edition在Welcome(及其它)页提供了高级特性棗请一定要读一读帮助文件的增强特性部分。
3. 输入应用程序的名称,示例程序使用了Single Document ApplicationExample。
4. 输入公司名称,示例程序用的是A Sample Company。
注 InstallShield的Free Edition(免费版)只为 Development Enviroment域提供了一个选择项:Microsoft Visual C++ 6。
5. 在Application Type域选择一个列表项,示例程序选的是SoftwareDevelopment Applicaion;该安装程序没有标准程序类型,而Software DevelopmentApplicaion支持实用程序。
6. 在Application Version 域输入版本号,我们用的是1.0,当然可以沿用自己公司中的编号。
7. 单击Application Executable域旁边的“...”(省略号)按钮,你会看到一个标准打开对话框用于查找硬盘上的应用程序,示例程序用的是SNGL_DOC.EXE(我们在第3章中建立、第15章中修改的那个程序,在Resource文件夹下)。
8. 单击Next,你会看到如下图所示的Project Wizard - Choose Dialogs对话框:

在这里选择的一系列对话框会在用户的安装过程中显示出来,因为我们使用的是企业内部应用型的程序,所以不选中Software License Agreement、SetupType 和Custom Setup对话框。对本章前面部分讨论过的其它打包模型来说,则可能需要选择其中的某些项目。在这个对话框中有几个需要注意的地方:首先,当从一个对话框选项转移到另一个对话框选项时,请注意该对话框左下角的变化,Project Wizard会显示出该对话框的一个微型缩影,以方便你确认是否要选用这个对话框;加亮一个对话框后单击Preview按钮,所看到的对话框与用户看到对话框相同。显然,你以后还可以修改这个对话框,但预览方法有助于你预先了解安装程序中要使用的对话框。
9. 选择想要加进安装程序的对话框,单击Next,你会看到如下图所示的Project Wizard - Choose Target Platforms对话框:

由于我们想把我们的程序安装到各种支持程序上,因此不需要改动要安装的平台。然而,在某些情况下你可能想作些选择。减少支持平台的种类会同时带来两种结果:第一、减少了所建立的安装程序的大小棗这对于开发占用空间少的共享软件很有帮助;第二、减少了用户在不适用的Windows版本中使用程序的可能性——这对所有程序设计者都有帮助。
注 不选中Show only Available platforms复选框时,系统将会显示专业版InstallShield提供的所有平台选项。
10. 根据需要选择一种或多种(至少一种)平台,单击Next,你会看到如下图所示的Project Wizard - Specify Languages 对话框:

由于Free Edition版只支持一种语言,所以这里不需要作改动。与所有其它的选择一样,多选并没有必要。增加语言必然增长安装程序的长度,也会给用户造成困惑,最好只选所用的语言。
11. 选择所用的一种或多种(至少一种)语言,单击Next,你会看到如下图所示的Project Wizard - Specify Setup Types 对话框:

因为我们使用的是企业打包模型,所以我选择了Network安装类型.其它打包模型要求作出其它选择,包括常见的方式:定制方式、典型方式和最小方式。有趣的是InstallShield还提供了一些其它的选择。
12. 选择一种或多种安装类型,然后单击Next,你会看到如下图所示的ProjectWizard - Specify Components对话框:

Project Wizard 并不知道你打算安装哪些组件。示例程序使用了ProgramFiles、Shared DLLs和Help Files。你需要每次选择一个组件类型,并定义该组件类型下的文件。组件类型对程序进行了主要部分的划分,例如,某个用户在安装时希望安装所有的示例文件,但不安装帮助文件。组件类型并不需要指出具体由哪些文件完成该组件的任务,而是让用户选择把不同组件中的文件安装在同一目录或不同的目录下。
技巧 可以根据需要增加新的组件类型。例如:如果是数据库应用程序需要加入Database File组件,作起来很简单:单击Add按钮,向导会自动加入新的列表项,输入组件名称,按ENTER键就行了。
13. 选取Example Files,单击Delete,Project Wizard 会删除该组件类型。
14. 根据需要增加、删除组件类型,单击Next,你会看到如下图所示的ProjectWizard - Specify File Groups对话框:

示例程序使用了Program Executable Files、 Help Files和Shared DLLs。正常情况下,你会创建一些文件组,以便完成特定任务所需的所有文件能一次拷贝到目的地。文件组不受组件类型的限制,例如:拼写检查和语法检查都依赖于同样的DLL文件集,但使用的规则不同,你可以将DLL定义为一个共用的文件组,规则文件分别定义为另外两个组。如果用户选择了拼写检查,InstallShield就会拷贝相应的规则组和通用DLL文件组,但不会复制语法检查文件组。
15. 选取Program DLLs,单击Delete,选取Examples Files,然后单击Delete,删除本示例程序中不需要的两个文件组,显然文件组的选择取决于程序的组织方式、所需文件的复制位置。请谨记,同一文件组中的所有文件都将拷贝到硬盘的同一个目的目录下。
16. 根据需要增加、删除文件组类型,单击Next,你会看到如下图所示的Project Wizard - Summary对话框:

这时应检查所列清单,保证正确无误,然后再开始生成安装程序。
17. 单击Finish。InstallShield用所选定的选项生成安装程序,界面会变为如图16.2所示的样子,注意这时你会看到创建安装程序所需的C++源代码,你可以像修改其它工程那样对这个工程进行修改。
注释 不要以为InstallShield生成的源代码文件与普通工程生成的源代码文件完全一样,实际上,它生成的文件中有些是你从未见过的辅助性文件,比如安装规则文件(SETUP.RUL),如图16.2所示。

这时,就有了一个空白的安装程序外壳,还需要作很多的配置,我们将在下节阐述。最重要的是要看到整个过程中几乎没有写什么代码,在定义了各种安装程序元素之后InstallShield就替你实现了。
Web链接 如果使用InstallShield还有问题,有许多方法可以得到帮助。这时最需要读一下README文件,其中含有许多Internet地址,例如:新闻组站点http://support.installshield.com/newsgroups/default.asp,它链接到了几个InstallShield专题的新闻组,只需单击一下,在你的新闻阅读器中就会建立一个新的文件夹。甚至对Free Edition版也有专门的新闻组,地址为installshield.is5.free-edtion。还可以找到讨论IDE、脚本和多媒体用法的新闻组,总而言之,这些新闻组提供了与其它程序开发者交流使用打包程序、成功打包应用程序的经验。
设置组件 首要的任务是设置各种组件。组件是安装过程中出现的选择项,如果以前用过定制安装,就会很清楚。它们是一系列的复选框,这些复选框让你选择是否安装某个程序项。
配置组件相对比较容易,单击Components选项卡,你会看到如下图所示的Components - Program Files对话框:

组件对话框中包含了所选组件的完整清单,这里有三个组件:Program Files、Help Files、 Shared DLLs。在阅读下一节之前,必须全部设置这三个组件。双击Description属性,你会看到如下图所示的Properties对话框:

其它所有的属性对话框与该对话框相似。每个属性对话框都用来描述要用该属性完成什么任务。也可以输入属性的值,本例中输入为:All the files requiredto run the application。完成后单击OK,Description属性就包含了所输入的内容。
不需要改变所有的组件属性——真正修改你进行的修改取决于所建立的应用程序的打包类型,例如,对于公司内部应用程序,一般不允许用户选择要安装的组件,所以没必要定义组件描述。但是,无论选择何种打包模型,有些属性都需要修改,下面我们逐一讨论:
Status Text(状态文本) 这些文字是在安装程序向目标盘拷贝文件时用户看到的提示。Progress对话框将显示一些类似于“Copying programfiles...”的提示,这些提示适用于缺省组件。对定制组件来说,你或许想给出一些特殊信息。
Installation(安装) 如果遇到过自己的最新版本的DLLs被其它程序覆盖的情况,你就会切身体会到这个属性的重要性。该选项告诉InstallShield在覆盖文件之前你是否想先检查它的时间戳,我总是使用NEWERVERSION/NEWERDATE或SAMEORNEWERVERSION/SAMEORNEWERDATE选项来代替缺省的ALWAYSOVERWRITE规则。实际上,这些选项告诉InstallShield仅当所装文件比硬盘中现有文件日期更新或版本更高时才覆盖原文件。
Destination(目的) 所有应用程序文件的标准安装位置是目的目录,它由用户选择。然而有些情况下使用用户设定的目录会浪费盘空间,例如:大多数Visual C++程序运行时要求C运行时库文件和MFC文件,如果每个应用程序都把它们打包后安装到自己的目录下,硬盘空间该是多大的浪费啊?因此,总是把这些共享的DLLs放在Windows SYSTEM目录下,这时就要更改这个属性(打开属性对话框时,会看到可供拷贝的所有映射地址,选中需要的那个)。
必需的组件 在这里设置组件间的关系,如下图所示。图中我告诉InstallShield,当用户安装Program Files组件时,他或她也必须安装SharedDLLs组件(只有在没有Shared DLLs组件程序就不能正常运行的情况下定义组件间的关系才有意义)。

技巧 如果你打算在Internet 或Intranet上安装应用程序,那么请特别留意FTP Location和HTTP Location属性。这些属性使用户可以从Web链接开始安装,并从Web服务器上拷贝所需的文件。如果安装文件处于FTP服务器的控制之下,那么一般选用FTP Location属性。
配置组件时最后一个绝对必须留意的属性是Include File Groups属性,直到现在我们还没有给Program Files(或其它)组件指定任何东西。双击该属性,你会看到如下图所示的Properties对话框:

Properties对话框包含了指定给某个组件的所有文件组的清单,前面我们讲过一个例子,安装时可以选择用拼写检查还是用语法检查,它们的DLL 文件相同,规则文件不同。前面我还讲到过要设置三个文件组:一个带有语法检查规则文件,一个带有拼写检查规则文件,第三个带有通用的DLL文件。现在就是设定其间关系的时候了,单击Add按钮,你会看到如下图所示的Add File Group对话框:

正如你所看到的,Add File Group对话框包含了我们使用Project Wizard定义的三个文件组。在继续阅读本章之前,你需要按下表定义组件与文件组之间的关系。表16.1给出了本例所用的设置:
设置文件组 建立一系列的组件对安装程序并没有多大的帮助,它只是告诉用户哪些组件可以被复制到硬盘上,但还没有告诉安装程序要复制哪些文件,现在我们就来做这件事棗为前面定义的文件组定义一系列文件。
先单击File Groups选项卡,你会看到带有所有文件组清单的File Groups对话框,如图16.3所示。选择要配置的文件组很容易,单击窗口左边给出的文件组列表项。
单击Help Files文件夹旁边的加号(+)标记,再单击Links列表项,你会看到如下图所示的File Groups-Help Files\Links对话框,从这个对话框中定义该文件组包含的一个或多个文件。
右击File Groups-Help Files\Links对话框,从上下文相关菜单中选择InsertFiles,你会看到标准的“打开文件”对话框,找到第15章建立的Sngl_Doc.HLP文件,单击OK,就将它加入了Help Files 文件组中。还需要把Sngl_Doc.EXE文件加入到Program Excutable Files文件组,最后一个文件组是Shared DLLs,需要加入下列文件:MFC42.DLL和 MSVCRT.DLL,它们将放在WindowsSYSTEM文件夹下。

定义资源 到此为止,我们已经设置了组件和文件组。下面要给用户提供一些标识信息,因为他们当然希望对所安装的程序有所了解。选取Resources选项卡,你会看到如图16.4所示的Resources窗口,其中含有两个对话框:Resources - StringTable 和Resources - String Table\English。我们要在Resources - StringTable\English对话框中进行修改。
在Resources - String Table\English对话框中进行的绝大多数修改并不影响安装程序,修改的目的是为了帮助用户理解安装程序进行的工作。改变资源值的做法和其它对话框改变属性的做法基本相同,只是双击要改变的Identifier(标识符),InstallShield 就会显示相应的对话框供修改,下图是修改COMPANY_NAME标识符的示例:


表16.2是我们对示例程序所做的修改——显然,各标识符的取值依据安装程序的不同而不同。

决定安装介质类型 现在我们要做配置安装程序必须完成的最后一件事了:就是告诉InstallShield要使用何种介质发行你的应用程序。在绝大多数情况下,你会使用CD作为主要的发行介质,如果应用程序很小的话,也可以使用软盘作为另一种发行方法。如果你只是选择CD作为唯一的发行介质,那么现在你不用再做什么了。否则的话,选择Media选项卡,你会看到如图16.5所示的Media对话框及窗口:

正如你所看到的,CD已经定义好了(如图16.5的CD 文件夹所示)。需要用Media Build Wizard向安装程序中加入其它的介质类型,下面的步骤用于增加软盘介质类型:
1. 单击Media Build Wizard选项,你会看到Media Build Wizard - Media Name对话框,如下图所示:

2. 输入3.5" Floppy后,单击Next,你会看到如下图所示的Media Build Wizard- Disk Type对话框。请注意,InstallShield支持各种各样的介质类型,其中包括2.88MB软盘。

3. 选取3.5" Diskette-1.44MByte选项,然后单击Next,你会看到如下图所示的Media Build Wizard - Build Type对话框:

选择Full Build选项时,系统将压缩应用程序中包含的所有文件、建立CAB文件并创建全功能的安装程序。Quick Build选项用于测试安装程序是否正确。
4. 选择Full Build选项,然后单击Next,你会看到如下图所示的Media BuildWizard - Tag File对话框,从这里输入公司名称及相关的应用程序信息。

5. 在这个对话框中输入所有需要的信息。示例程序在Company Name 域使用的是ABC Corporation,在Application Name域使用的是Single DocumentApplication Example,在Product Category域使用的是Word Processor,在Misc.域使用的是Utility Style Text Editor。
6. 单击Next,你会看到如下图所示的Media Build Wizard - Platforms对话框:

7. 单击Next,你会看到如下图所示的Media Build Wizard Summary对话框,这是验证所有设置正确性的最后机会。

8. 检查所有设置,正确无误后单击Finish,InstallShield创建新的、你所需要的安装程序。
注释 InstallShield的Free Edition版此时会显示一条错误信息,指示没有足够的内存来创建安装程序。可以忽略这个问题,然后重试,如果还不正确,使用缺省的安装设置进行创建。做法是:右击Default文件夹,从上下文相关菜单中选择Media Build Wizard,在Media BuildWizard对话框的第一个显示中选择Default选项,然后单击Next,直到不再出现错误消息,按Finish按钮,InstallShield创建所需介质类型。
这时你会看到Building Media对话框,InstallShield 自动创建安装程序,安装程序创建后,Building Media对话框如下图所示,只需单击Finish按钮,这下就全部完工了!