分类: C/C++
2009-03-26 09:01:16
InstallSheld6.3如何使用LaunchAppAndWait()?
我想在安装结束前调用另一个程序,我知道要用到它的LaunchAppAndWait()函数,但不知道应该在哪个地方添加脚本,帮帮忙,谢谢啦!
18.4 LaunchAppAndWait
语法:LaunchAppAndWait (szProgram, szCmdLine, lWait);
说明:LaunchAppAndWait函数运行由szProgram指定的带有szCmdLine指定的命令行参数的应用程序。第三个参数,lWait指示安装在继续前是否要等待直到运行的应用程序终止。
一个安装程序只能监控由szProgram指定的应用程序;如果该应用程序要运行其它应用程序或进程,安装程序不能监控它们。因此,安装程序将在第一个应用程序结束后继续,即使那时由第一个应用程序运行的其它应用程序仍在运行。注意如果运行的应用程序终止失败,则安装程序将无限等待运行的应用程序完成。
参数:
szProgram
指定要被运行的应用程序的文件名。建议要指定应用程序的完整路径和文件名。如果你不包括一个路径,InstallShield将使用被Windows API 函数CreateProcess使用的相同的查找次序来定位文件。如果文件未能在这些位置找到,函数将失败。
如果应用程序的全限定名包括长文件夹名和/或一个长文件名,在把szCommand传递给LaunchAppAndWait之前先把它传递给LongPathToQuote。
szCmdLine
指定传递给运行的应用程序的命令行参数。为运行没有命令行参数的应用程序,传递一个空字符串。
lWait
指定安装程序在继续前是否要等待运行的应用程序终止。在该参数位置传递下列预定义常量之一:
NOWAIT:指定安装程序在运行应用程序后立即继续,应用程序将和安装程序脚本同时运行。注意使用该参数等效于调用函数LaunchApp。
WAIT:指定安装程序必须等待直到由该函数运行的应用程序终止。
返回值:
1:表明应用程序成功运行。
< 0:表明应用程序未能运行。
注解:
·InstallShield 安装程序使用函数CreateProcess。在InstallShield运行应用程序后,它查找装入的应用程序的窗口句柄。如果它找到窗口句柄,则它在继续前等待直到应用程序窗口消失。
·安装程序不能监控一个不创建窗口的应用程序。如果指定的应用程序没有创建一个窗口,安装程序在运行应用程序后立即继续。注意应用程序的窗口不需要可见,但它必须存在,以便让安装程序等待。
·一些应用程序试图装入DLLs并且当那些DLLs不能被定位时不能正确运行。为确保一个应用程序能找到它需要的DLLs,有必要在调用LaunchAppAndWait前改变到包含可执行应用程序的目录。为改变当前目录,调用ChangeDirectory函数。
·如果运行的应用程序终止失败,则安装程序将无限等待运行的应用程序完成。
·LaunchAppAndWait以一个全屏DOS窗口来运行DOS程序。为以一个不同类型的窗口来运行一个DOS程序,你必须直接调用Windows APIs。
第2楼 回复人:Veeve 2003-06-06 14:27:59 返回顶部
谢谢你的热情,但是答非所问。
我是不知道在哪里添加LaunchAppAndWait()
!!
第3楼 回复人:lion_lh 2003-06-06 15:00:46 返回顶部
在function OnFirstUIAfter()事件里最后添加
第4楼 回复人:Veeve 2003-06-06 20:45:01 返回顶部
我是在这个事件里添过的,
LaunchAppAndWait(TARGETDIR^"myex.exe","",WAIT);
MessageBox(TARGETDIR^"myex.exe",MB_OK);//for debug
第二句正确执行了,但LaunchAppAndWait那一句却没执行,难道这个时候目标文件还没产生??(注:我添在OnFirstUIAfter()的最后)
不懂...
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
需要多个安装程序的情况是比较多的,如"金山词霸"的安装。启动多个安装程序可就下面两种情况而有不同的方法。
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) 编译并运行。