开发点歌系统--在installShield中一起另外安装一程序

来源:互联网 发布:台湾ptt大陆网络新词汇 编辑:程序博客网 时间:2024/05/22 07:46

开发了一个电脑点歌系统,一直是在用Copy方式分发,太不方便了,前几天想来想去,还是得做成安装包,这样才有利于网上分发,用户不用去做一些很麻烦的设置,工具当然用 InstallShield,可是太难找合适的了,而且也有很多技巧性的东西想长久记下来,于是今天开始了写博客。

 

  开发了一套软件,要另外安装一程序,如何在installShield中一起安装,不用用户另外安装

 

     启动多个安装程序有两种情况而有不同的方法。
  1.   由InstallShield构造的两个安装项目
  在这种情况下,用户首先指定其中一个为主安装项目,另一个为次安装项目,并且次安装项目已被编译过,能完全正确运行。这时按下列步骤进行:
  (1)   启动InstallShield   5.5,将主安装项目调入。
  (2)   切换到项目工作区窗口的 "Setup   Files "页面,将次安装项目要发布的安装媒介/Dsik1、/Disk2...等文件夹下的文件全部调入用户指定的/目录项中。
  (3)   在主安装项目的脚本程序中,添加下列语句:
     DoInstall(   SUPPORTDIR   ^   "Setup.ins ",   " ",   WAIT   );
  其中,DoInstall就是用来启动另一个安装程序的,其函数原型如下:
     DoInstall   (szInsFile,   szCmdLine,   lWait);
  该函数是用来运行另一个安装程序。参数szInsFile用来指定用户要运行的被正确编译过的脚本文件.ins的文件全名;szCmdLine用来指定InstallShield命令行内容;lWait表示运行的操作方式,它可以是下列值之一:
   NOWAIT   两个安装程序同时运行
   WAIT   在次安装程序运行完成后,才进行主安装项目的下一步操作
  该函数返回1时表示成功调用了次安装程序,并将流程返回到调用DoInstall的下一个语句中。若InstallShield找到了要调用的安装脚本文件,但却不能启动它,那么流程仍就被返回,并且此函数返回1。返回-2时表示InstallShield没有找到要调用的安装脚本文件。返回其他负数则表示产生不可预知的错误。
  (4)   将项目工作区窗口切换到Media页面,单击Media   Build   Wizard项,创建新的媒介。
  (5)   编译并运行。
  需要说明的是,如果被调用的次安装程序中也有DoInstall的调用,那么就形成了嵌套,从而可以启动许许多多的安装程序。
  2.   由第三方提供的安装程序包
  如果要执行的另一个安装程序是第三方提供的安装程序,它可能只有一个可执行的文件。这时就要使用LaunchAppAndWait和LaunchApp函数来启动,它们的原型如下:
   LaunchAppAndWait   (szProgram,   szCmdLine,   lWait);
   LaunchApp   (szCommand,   szCmdLine);
  这两个函数都是用来启动一个应用程序,它们唯一的区别是LaunchApp函数直到已启动的应用程序被关闭或中断后,流程才会被返回,而LaunchAppAndWait可以立即返回流程。参数szProgram和szCommand都是用来指定要启动的应用程序文件全名,但对于szProgram来说,若应用程序没有指定路径和文件扩展名,LaunchAppAndWait不会启动该应用程序,而对于szCommand来说,若没有指定应用程序的路径,LaunchApp将在当前目录、Windows目录、Windows系统目录以及其他PATH环境变量指定的目录中进行查找。szCmdLine用来指定应用程序执行时的命令行参数,若没有,则将此参数设为NULL。lWait用来指定流程的返回方式,它可以是NOWAIT(立即返回)或WAIT(直到应用程序关闭或中断才将流程返回)。
     如果需要启动的应用程序需要的DLL文件不在Windows系统目录中,则需要调用ChangeDirectory函数来改变调用DLL的目录,例如下面的过程是通过LaunchAppAndWait函数执行另一个安装程序:
   (1)   启动InstallShield   5.5,将主安装项目调入。
   (2)   切换到项目工作区窗口的 "Setup   Files "页面,将次安装项目要发布的安装媒介下的文件全部调入用户指定的/目录下。
   (3)   在主安装项目的脚本程序中,添加下列语句:
  NUMBER   nResult;
  STRING   szDir;
  program
   ...
   szDir   =   SUPPORTDIR;
   StrRemoveLastSlash   (szDir);
   ChangeDirectory   (szDir);
   LaunchAppAndWait   (   SUPPORTDIR   ^ "Setup.exe   "   ,   " "   ,WAIT);
  endprogram
  (4)   将项目工作区窗口切换到Media页面,单击Media   Build   Wizard项,创建新的媒介。
  (5)   编译并运行。  

我们在制作安装包时,有些情况下会涉及第三方安装的集成,这里将讨论如何调用安装第三方包,以及需要注意的事项。

 

第三方安装包的介质类型有很多,主要有:单独的一个Setup.exe,单独的一个msi包,或者是类似光盘结构的一组文件及文件夹的安装包。

首先,如何在InstallShield中添加第三方安装包:

如果是单独的Setup.exe或单独的msi包,可以将他们添加到【Behavior and logic】 -> 【Support Files】 -> 【Language Independent】中。

如果是一组文件以及文件夹的安装包,可以将他们添加到【Behavior and logic】 -> 【Support Files】 -> 【Advanced Files】-> 【Disk1】中。

其次,第三方安装包在InstallShield中的路径如何获取:

如果是单独的Setup.exe或单独的msi包, 可以通过SUPPORTDIR获取,然后组合出第三方安装包的执行路径。(注意:InstallScript工程中,SUPPORTDIR是一个系统变量,可以直接利用;而在MSI工程中,SUPPORTDIR是一个Property,所以需要通过MsiGetProperty读取)

如果是一组文件以及文件夹的安装包,可以通过SETUPEXEDIR方安装包的执行路径。(注意:这里SETUPEXEDIR的读取方式同SUPPORTDIR)。

最后,调用方法:

如果是.exe文件,可以通过LaunchAppAndWait直接调用。

如果是.msi文件,可以通过LaunchAppAndWait直接调用Windows Installer安装引擎,然后以参数的形式给入.msi路径。

 

上述方式,只适用于主安装包是.exe的情况,如果是将主安装包做成单独的.msi包,其中SETUPEXEDIR将无效。

另外,SETUPEXEDIR是InstallShield 8或9之后才有的一个系统变量,所以大家只用之前,可以通过帮助文档确认该变量的使用限制。

转自Kevin Wan博客,更多Installshield打包技术交流问题可查看Appinstall论坛


原创粉丝点击