我的Inno Setup安装程序包含一个小型网络服务器和一个桌面应用程序。这两个程序都是独立的可执行文件。在安装过程中,我想在启动桌面程序之前先启动webserver,使其运行起来。我试图在 [Run]
的部分,如下所示。
[Run]
Filename: "{app}\Server\{#ServerExeName}"; \
Description: "{cm:LaunchProgram,{#StringChange(ServerName, '&', '&&')}}"; \
Flags: waituntilidle runascurrentuser
Filename: "{app}\App\{#AppExeName}"; \
Description: "{cm:LaunchProgram,{#StringChange(AppName, '&', '&&')}}"; \
Flags: nowait postinstall
这并不奏效,因为安装程序不能正常完成,操作系统挂起等待服务器 (ServerExeName
). 我猜它是在等待服务器进入空闲状态,而这是不会发生的。同样的事情也适用于'waituntilterminated'标志,因为服务器将不会终止)。在继续(启动其他应用程序)之前,有什么首选的Inno Setup方法来确保服务器已经启动?
我正在运行Inno Setup 5.6.1u,但如果需要的话我可以升级。网络服务器是CherryPy网络服务器,使用PyInstaller捆绑到exe中。应用程序是定制的基于wxWidgets的GUI。
waituntilidle
是非常特殊的事情。它在内部使用 WaitForInputIdle
WinAPI函数. 阅读更多关于它的信息来了解它何时可以被使用。
如果它不适合您的服务器应用程序,您必须在其中实现某种信号,以便Inno Setup可以查找。在*nix系统中,通常使用pidfile来实现这个目的。或者使用一个mutex或者其他类似的机制。
更简单的方法是在您的应用程序(而不是服务器)中添加一个函数开关,使其等待服务器的运行。