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

Inno setup 如何使用带参数的exec与正在提取的运行进程交互,inno-setup,Inno Setup,药膏!好吧,我已经在网络(和堆栈溢出)上搜索了一个答案。我需要帮助让我的Inno安装程序向正在运行的应用程序发送带有参数的命令行 在myapplication\u setup.exe中,我打包了myapplication.exe。现在,myapplication.exe具备了接收命令行参数的能力。如果我使用某些参数启动第二个实例,它将把它们传递给第一个实例,然后退出它自己的第二个实例(两个都退出)。这使我可以使用myapplication.exe的第二个实例退出第一个实例。如果我从批处理文件、c

药膏!好吧,我已经在网络(和堆栈溢出)上搜索了一个答案。我需要帮助让我的Inno安装程序向正在运行的应用程序发送带有参数的命令行

在myapplication\u setup.exe中,我打包了myapplication.exe。现在,myapplication.exe具备了接收命令行参数的能力。如果我使用某些参数启动第二个实例,它将把它们传递给第一个实例,然后退出它自己的第二个实例(两个都退出)。这使我可以使用myapplication.exe的第二个实例退出第一个实例。如果我从批处理文件、cmd框或run框中执行此操作,则此部分将非常有效

现在,我需要安装程序调用此命令行:“c:\myapplication\myapplication.exe quit”,然后检查两个实例是否都已退出。我可能不需要检查安装程序启动的第二个实例,因为它们几乎同时退出。我对inno不太了解,下面是我为实现命令行功能而编写的代码。问题是我总是得到267的结果代码,而我的应用程序从未退出过

安装程序需要调用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;
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解压缩到temp目录并从那里运行它。比如:

[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;
从Inno帮助

“不要在文件名参数中包含引号;函数将自动添加引号。”

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

解决办法是:
RemoveQuotes(卸载字符串)

嗯,我从未想过从另一个目录运行myapplication.exe。多亏了应用程序的互斥,这一部分工作正常。但是,我仍然无法让exec运行myapplication.exe,它一直说目录无效。现在,我使用标准windows用户帐户进行安装,因此我在安装位置没有管理员权限。也许{tmp}是禁区?我可以创建一个临时目录,但我不知道如何提取到它。当我使用{tmp}目录时,Exec函数会给我结果代码“C:\Users\BobUser\AppData\Local\Temp\is-N9JS3.tmp\myapplication.exe:系统找不到指定的文件。这可能是.net错误,因为我的应用程序是.net windows窗体应用程序?你的应用程序可能缺少某些依赖项。如果在屏幕上显示消息时打开资源管理器并导航到列出的目录,会发生什么情况?EXE在吗?@mirtheil-Hmm。。。我没想到。啊!它确实有依赖项,这就是为什么我首先尝试从{app}运行它。但是,不,临时文件夹是-N9JS3.tmp甚至不存在,这意味着提取临时文件也不起作用。@mirthel嘿!我让exec回答了真的!我放弃了临时工的想法,反正还是抽到了{app}。我的代码缺少的是ExpandConstant位,我删除了工作目录。但是,在exec行中有一个额外的括号。它应该是:Exec(ExpandConstant({app}\myapplication.exe')、'quit'、''、SW_HIDE、ewwaituntiltered、ResultCode)。非常感谢!我会记下你的答案!他们没有将带引号的文件名传递给
Exec()