Как использовать exec с параметром для взаимодействия с запущенным извлекаемым процессом - PullRequest
2 голосов
/ 13 ноября 2011

Salve!Ну, я искал сеть (и переполнение стека) для ответа.Мне нужна помощь, чтобы мой установщик Inno отправил командную строку с параметрами в работающее приложение.

В myapplication_setup.exe я упаковал myapplication.exe.Теперь myapplication.exe имеет возможность получать параметры командной строки.Если я запускаю второй экземпляр с определенными параметрами, он передаст их первому экземпляру, а затем выйдет из своего второго экземпляра (оба будут завершены).Это позволяет мне использовать второй экземпляр myapplication.exe, чтобы завершить работу первого экземпляра.Эта часть отлично работает, если я делаю это из пакетного файла, из окна cmd или из поля запуска.

Теперь мне нужен установщик, чтобы вызвать эту командную строку: «c: \ myapplication \ myapplication.exe quit» и затем проверитьчтобы увидеть, вышли ли оба экземпляра.Возможно, мне удастся сойти с рук, просто проверив второй экземпляр, запущенный установщиком, потому что они оба выходят примерно в одно и то же время.Я не очень хорошо знаю Inno, поэтому вот код, который я придумал для выполнения функции командной строки.Проблема в том, что я всегда получаю ResultCode из 267, и 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 ]

5 голосов
/ 13 ноября 2011

Похоже, что 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;
3 голосов
/ 28 ноября 2012

Из справки Inno ...

"Не включать кавычки в параметр Filename; функция добавит их автоматически."

Этот тоже меня поймал. Я создал установщик, который вызывает установщик стороннего продукта. Работало нормально. Но программе удаления пришлось искать в реестре UninstallString стороннего продукта. Строка в реестре содержит кавычки, поэтому, когда я передал ее в Exec, произошел сбой с кодом ошибки 267.

Решение было позвонить: RemoveQuotes (UninstallString);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...