前言Installshield可以说是最好的做安装程序的商业软件之一,不过因为功能的太过于强大,以至于上手和精通都不是容易的事情,之前都是用Installshield的ProjectAssistant对付过去的,这次做这个安装程序,为了实现一些功能,必须写代码,国内外现成的资料很少,而且很多都语焉不详,自己反复啃了多次,对比Installshiel自带的help,才明白资料所表达的意思。这个安装程序虽然比较简陋,在行家眼里可能是小菜一碟,但是也花了笔者一个星期的时间,阅读了很多资料,啃了好几天英文help,集成了很多先驱者的经验,也费了自己不少心血做成的,对每一段代码的用处、每一个用到的函数都进行了详细的说明,因此转载时请务必保留转载出处和由艾泽拉斯之海洋女神出品的字样;如需刊登,请与作者联系。在此要感谢吞硬币的小猪,天下晓明,余满青,海洋C++乐园(此海洋不是彼海洋)等大虾在互联网上的无私奉献,他们的贴子和博客给了我很大启示。因为本人是做java出身的,因此对这种类C++语言还是第一次接触,有理解不当之处,请朋友们指正。欢迎Email至little_fairycat@126.com正文需求:公司做了一个软件产品,1.该软件运行需要JDK环境(不是JRE,因为该软件要向windows注册一个服务,用到了JavaService,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.在安装结束时,显示readme.txt文件9.在安装结束后,启动指定的程序10.完美卸载笔者所用的环境为Installshield12PremierEdition,WindowsXPwithSP2,该环境下建立的工程可以直接使用在Installshield2008PremierEdition下,Installshield2008在打开Installshield12所建的工程时会提示你是否需要进行Upgrade,确认即可,软件会自动为你进行升级,很方便。下面我们一步一步来建立一个基本的工程,并且使用脚本来完善和丰富所需功能第一部分:基本设置1.打开Installshield12PremierEdition,新建一个InstallscriptMSIProject,这种被称之为半脚本程序,因为兼具BasicProject基本类型和InstallscriptProject全脚本类型两者的优点,我比较喜欢用。像我这样需求的,既要用到Wizard的便利,又想写一点脚本来实现一点自定义操作的,就比较适合用这种类型啦。选择类型为WindowsInstaller|InstallScriptMSIProjcet,输入工程名,指定工程所在的文件夹。2.界面会切换到ProjectAssistant,我们先从这里开始把工程的基本组件和基本文件建立好。3.在ProjectAssistant界面的底部,会有一个引导动作条,在建立该工程的基本结构和文件时,我们都将在此界面进行操作,下文都将以“引导条”来指代这个引导动作条。4.点击引导条上的ApplicationInformation这里输入:公司名,公司名将会出现在Setup.exe的注解中软件名,将会出现在安装过程的左上角标题栏上版本号,没看到在哪,不过自己比较方便地知道自己在编译哪个版本的软件公司网址,没看到在哪,而且如果该公司没有网址呢?而且这里有点bug,好像默认的值总是会报一个String_ID1为空的错误,自己输入一个网址就不会报错。是否在你创建了更新时自动通知最终用户,没用过,我都选了No。选择一个图标,这个图标会出现在“添加或删除程序”里,我一般用默认的,当然你可以替换成自己想要的图标。5.点击引导条上的InstallationRequirement这里选择对操作系统和一些软件的需求。根据自己需要来选择是否要求操作系统的版本,已经是否要求安装了某些软件。6.点击引导条上的InstallationArchitecture这是个十分有用的设置,对于本文所用的分布式软件来说非常合适,分布式软件的每个组件可以设置为一个Feature,用户可以自由选择安装某些功能。将选项DoyouwanttocustomizeyourInstallation选择为Yes。点击选中根节点InstallationArchitecture,点击New创建新的Feature,可以为每个Feature指定新名称。还可以在Feature下创建子Feature,比如如果文档Feature下包括软件本身文档,和软件所需的运行环境的文档,那么可以创建两个子Feature,分别包含两种文档,用户在安装时就可以选择安装部分或者全部文档了。这里我们没有用到子Feature,用途和普通Feature一样。不出现选择安装的组件出现选择安装组件这里,建立好所有Feature后,我们将切换到InstallationDesigner做一个设置找到InstallationDesigner页面上左边导航树Organization|Features分支,你会看到这里Features都显示为原始的名称,而非我们改过的名字,因为Feature有Name和DisplayName两种名称,我们刚才改的不过是DisplayName,为了便于查看和使用,我们在这里把Name也改一下注意Name不可以有空格,可以使用下划线继续切换回ProjectAssistant7.点击引导条上的ApplicationFiles我们将在这里对安装路径进行微调,并且为每个Feature指定需要安装的文件这里我不想使用ProgramFiles|CompanyName|ProductName这个路径,我想使用ProgramFiles|ProductName,我直接点击选中MyProductName[INSTALLDIR]拖动到ProgramFileFolder下,还可以直接将MyProductName改成自己想要的文件夹名字接下来,为每个Feature指定要安装的文件。打开这个下拉列表,所有的Feature都在这里,按顺序来给每一个Feature建立文件夹,并且导入所需的文件。选择第一个Feature,即Server,点击MyProductName[INSTALLDIR]节点,右键点击,在菜单上选择NewFolder来创建一个文件夹。创建一个Server文件夹,这个文件夹将用来存放该组件需要的一些文件。再在Server文件夹下创建一个icon文件夹,存放该组件所用的图标。然后为该Feature添加安装时该Feature要安装的文件。这里我们建立的icon文件夹是用来存放这个feature在后面要建立快捷方式时使用的图标的。为这个icon文件夹添加相应的图标文件,并且记住图标文件的来源文件夹,后面设置快捷方式的时候要用。点击选中要添加文件的文件夹,然后点击右下角的AddFiles,然后添加文件接下来我们为Feature添加文件夹,如果这个文件夹中的全部文件都为这个Feature所需。添加文件夹的好处在于只要文件夹位置和名称不变,那么文件夹里面的文件都是动态加载的,有多少加载多少,不用考虑文件名的改动带来的影响。点击选中要添加文件夹的文件夹,然后点击右下角的AddFolders,然后添加文件夹。选中文件夹,点击确定。会询问你是否要使用动态文件链接,我都选择确定,好处就在于我刚才上面所述。显示了源文件夹,如果这个文件夹下有子文件夹,并且也需要一并添加进来的话,务必钩选Includesubfolders选项。这里还允许做一些简单设置来包含或者排除一些特定文件,支持通配符。点击OK确定加入文件夹。如法炮制为每个Feature建立文件夹,并且添加文件,最后效果如图所示Document这个Feature,除了文件所用的图标外,什么都不要添加,后面我们将用安装时实时拷贝的方式来拷贝文档进来。8.接下来我们为可执行文件创建快捷方式。点击引导条上的ApplicationShortcuts点击New新建一个快捷方式选择一个要建立快捷方式的Feature。如果要建立快捷方式的程序为非.exe形式,请把FilesOf选择选为AllFiles(*.*)格式。我们的程序安装目标路径设置在ProgramFiles下,因此双击[ProgramFilesFolder]打开,层层点击进入。我们这里要为client.bat建立一个快捷方式,因为这个是启动用的批处理文件。Installshield可以自动监测到.exe文件的存在,自动生成快捷方式,用户只需要做一些适当修改即可。新建的快捷方式将出现在这里,名字不好听,样子也不好看,我们将为它改一个名字,并且换一个图标。选中快捷方式,点击Rename,并且为这个快捷方式改一个适当的名字。注意右边的几个选项。CreateshortcutinStartMenu,将在开始菜单里创建一个快捷方式。CreateshortcutonDesktop,将在桌面上创建一个快捷方式。UsealternateshortcutIcon,替换快捷方式的图标Associateafileextensionwiththeshortcut’starget,没用过,不知道什么意思。我们在这里将只创建开始菜单的快捷方式,因此钩选第一项。钩选第三项,并且点击Browse来浏览图标。请回想刚才在为Feature添加文件的时候,每个feature都添加了对应的icon。这里,请把浏览的文件夹设定为刚才添加icons所用的文件夹,通俗的说,就是你刚才从哪儿添加一个图标进feature的,现在还是从哪儿添加的这个图标。其实这一点我是一直很费解的,当初不知道要这么选择图标,随便从外面一个任意文件夹里添加了一个图标,以至于打包后死活找不到图标,后来经过试验才知道这个被选中的图标文件要拷贝进来,打包进安装文件才可以。这一点上不能不提一下visualstudio,这个工具做安装程序虽然功能一般,但是思想还是不错的,当它的组件指定拷贝了图标文件后,在建立快捷方式时,快捷方式使用的图标是指向虚拟的安装目标路径下的图标文件的,而不是指定到这个实实在在的源文件夹。这一点差别就体现出了思想上的差异。如法炮制为每个Feature指定快捷方式,Documen