2024年3月31日发(作者:)

前言

Installshield可以说是最好的做安装程序的商业软件之一,不过因为功能的太过于强大,

以至于上手和精通都不是容易的事情,之前都是用Installshield的Project Assistant对

付过去的,这次做这个安装程序,为了实现一些功能,必须写代码,国内外现成的资料很少,

而且很多都语焉不详,自己反复啃了多次,对比Installshiel自带的help,才明白资料所

表达的意思。这个安装程序虽然比较简陋,在行家眼里可能是小菜一碟,但是也花了笔者一

个星期的时间,阅读了很多资料,啃了好几天英文help,集成了很多先驱者的经验,也费

了自己不少心血做成的,对每一段代码的用处、每一个用到的函数都进行了详细的说明,因

此转载时请务必保留转载出处和由艾泽拉斯之海洋女神出品的字样;如需刊登,请与作者联

系。

在此要感谢吞硬币的小猪,天下晓明,余满青,海洋C++乐园(此海洋不是彼海洋)等大

虾在互联网上的无私奉献,他们的贴子和博客给了我很大启示。

因为本人是做java出身的,因此对这种类C++语言还是第一次接触,有理解不当之处,请

朋友们指正。欢迎Email至little_fairycat@

正文

需求:公司做了一个软件产品,

1.

该软件运行需要JDK环境(不是JRE,因为该软件要向windows注册一个服务,用到了Java

Service,JDK才支持这个功能;不过这里侧重于判断是否安装了某软件是否安装,而不是纠

缠于该装JDK还是该装JRE);

2.

由于是Server-Client形式的,需要允许用户选择安装组件,比如A机只装Server端,B机

只装Client端;

3.

文档不打包在安装程序里,直接存放在光盘文件夹下方便用户查看,同时允许用户指定是否

安装文档到计算机上(为什么这样做,后面说明详细原因);

4.

该软件会以授权形式发放给用户,不同的用户,软件本身可能相同,而不同的只是授权文件

和一些配置,因此希望授权文件和配置文件不打包在安装程序里,而直接存放在光盘里,以减

少可能的重复打包安装程序的劳动;

5.

在安装完毕后,希望能自启动程序(因为该软件需要在安装完毕后启动一个程序,该程序实

现向Windows注册服务的功能,该程序最好由安装程序启动,而不是由客户手动启动)。

6.

希望有反安装程序

本文提到的“外部”指不打包在安装程序里的,与安装程序一起存放在光盘里的一些文件夹,这

些文件夹包含了安装中所需要的文件,同时也可能有其他用途,因此不适合直接压缩打包在安装

程序里。

该实例实现了如下功能:

1.

显示软件许可协议

2.

判断是否安装了本软件所需要的先决软件JKD1.6.0_04,如无,则启动外部安装程序进行安

装(同样原理可以用来判断是否安装了其他软件,只要该软件在注册表中有键值)

3.

安装允许用户选择需要安装的组件

4.

用户的输入信息、所选安装路径、所选安装组件将显示在安装界面上(Installshield虽然

自带了此界面,但是默认是显示为空的,需要写脚本来显示信息)

5.

根据用户选择的组件,在开始菜单显示程序的快捷方式(同样适用于桌面快捷方式,后面做

详细说明)

6.

根据用户选择的组件,从外部文件夹拷贝相应的文件到安装目标路径的文件夹中

7.

根据从外部拷贝进来的文件,创建快捷方式(这里主要是拷贝文档,并在开始菜单中创建快

捷方式)

8.

在安装结束时,显示文件

9.

在安装结束后,启动指定的程序

10.

完美卸载

笔者所用的环境为Installshield 12 Premier Edition,Windows XP with SP2, 该环境下建立

的工程可以直接使用在Installshield 2008 Premier Edition下,Installshield 2008在打开

Installshield 12所建的工程时会提示你是否需要进行Upgrade,确认即可,软件会自动为你进

行升级,很方便。

下面我们一步一步来建立一个基本的工程,并且使用脚本来完善和丰富所需功能

第一部分:基本设置

1.

打开Installshield 12 Premier Edition,新建一个Installscript MSI Project,这种被称之为半

脚本程序,因为兼具Basic Project基本类型和Installscript Project全脚本类型两者的优点,我

比较喜欢用。像我这样需求的,既要用到Wizard的便利,又想写一点脚本来实现一点自定义

操作的,就比较适合用这种类型啦。

选择类型为Windows Installer | InstallScript MSI Projcet,输入工程名,指定工程所在的文件

夹。