如何使用InstallShield中的LaunchAppAndWait()

转自 http://www.cnblogs.com/wenlin1234/archive/2007/06/28/798751.html 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) 编译并运行。

你可能感兴趣的:(如何使用InstallShield中的LaunchAppAndWait())