如何使用带参数的exec与正在提取的运行进程进行交互

时间:2011-11-12 20:20:06

标签: inno-setup

药膏!好吧,我已经搜索了网页(和Stack Overflow)以获得答案。我需要帮助让我的Inno安装程序将带有参数的命令行发送到正在运行的应用程序。

在myapplication_setup.exe中,我已经打包了myapplication.exe。现在,myapplication.exe具有接收命令行参数的功能。如果我使用某些参数启动第二个实例,它会将它们传递给第一个实例,然后退出它自己的第二个实例(两个都退出)。这让我可以使用myapplication.exe的第二个实例来退出第一个实例。如果我从批处理文件或cmd框或运行框中执行此操作,此部分将完美运行。

现在,我需要安装程序来调用此命令行:“c:\ myapplication \ myapplication.exe quit”然后检查两个实例是否已退出。我可能只是检查安装程序已启动的第二个实例,因为它们几乎同时退出。我不太了解inno,所以这里是我用来执行命令行功能的代码。问题是我总是得到267的ResultCode而myapplication从未退出。

安装程序需要调用exec函数并确保myapplication.exe在提取myapplication.exe的新版本之前已经退出。

有人可以查看我的代码并帮助我吗?谢谢!

[code]
function PrepareToInstall(var NeedsRestart: Boolean): String;
var
  ResultCode:   Integer;
begin
   if Exec('C:\myapplication\myapplication.exe', 'quit', '{app}', SW_HIDE, ewWaitUntilTerminated, ResultCode) then
   begin
      msgbox('True: C:\myapplication\myapplication.exe : ' + IntToStr(ResultCode), mbInformation, MB_OK);
   end
   else begin
      msgbox('False: C:\myapplication\myapplication.exe : ' + IntToStr(ResultCode), mbInformation, MB_OK);
      SysErrorMessage(ResultCode)
   end;
end;

2 个答案:

答案 0 :(得分:5)

看来267是“无效目录”错误 你确定Exec指向正确的位置吗?
就个人而言,我会将您的代码更改为以下内容:

[code]
function PrepareToInstall(var NeedsRestart: Boolean): String;
var
  ResultCode:   Integer;
begin
   if Exec(ExpandConstant('{app}\myapplication.exe'), 'quit', '', SW_HIDE, ewWaitUntilTerminated, ResultCode) then
   begin
      msgbox('True: C:\myapplication\myapplication.exe : ' + IntToStr(ResultCode), mbInformation, MB_OK);
   end
   else begin
      msgbox('False: C:\myapplication\myapplication.exe : ' + SysErrorMessage(ResultCode), mbInformation, MB_OK);      
   end;
end;

这当然假设现有的myapplication.exe也在{app}中。可以肯定的是,您始终可以将myapplication.exe解压缩到临时目录并从那里运行它。类似的东西:

[code]
function PrepareToInstall(var NeedsRestart: Boolean): String;
var
  ResultCode:   Integer;
begin
   ExtractTemporaryFile('myapplication.exe'); 
   if Exec(ExpandConstant('{tmp}\myapplication.exe'), 'quit', '', SW_HIDE, ewWaitUntilTerminated, ResultCode) then
   begin
      msgbox('True: myapplication.exe : ' + IntToStr(ResultCode), mbInformation, MB_OK);
   end
   else begin
      msgbox('False: myapplication.exe : ' + SysErrorMessage(ResultCode), mbInformation, MB_OK);      
   end;
end;

答案 1 :(得分:3)

来自Inno帮助...

“不要在Filename参数中包含引号;该函数会自动添加它们。”

这个也抓住了我。我创建了一个调用第三方产品安装程序的安装程序。它工作正常。但卸载程序必须在注册表中查找第三方产品的UninstallString。注册表中的字符串包含引号,所以当我将它传递给Exec时,它失败了,错误代码为267.

解决方案是致电:   RemoveQuotes(uninstallString);