Форум программистов, компьютерный форум, киберфорум
Lazarus
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.90/29: Рейтинг темы: голосов - 29, средняя оценка - 4.90
2 / 5 / 1
Регистрация: 25.04.2016
Сообщений: 125
1

Запустить внешнее приложение, передать ему параметры и получить результат

03.02.2017, 10:38. Показов 5903. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте.
Проблема такая:
Delphi
1
RunCommand(exe_name,[exe_param],output);
Думаю, что такое exe_name и exe_param, пояснять не надо)
Дебаг показал, что на этой строчке программа стопорится и дальше не идет. Сколько бы энтеров я ни нажал в своей консольке.
В чем может быть проблема? Перепробовал кучу вариантов... если что: задача запустить стороннюю программу, ввести в неё свои параметры и получить вывод. Если кто подкинет других вариантов, тоже буду благодарен =)

Добавлено через 10 часов 39 минут
Пробовал такой вариант
Delphi
1
2
3
4
5
6
7
Process:=TProcess.Create(nil);
    Process.Executable := exe_name+'.exe';
    Process.Parameters.Add(exe_param);
    Process.Options := Process.Options + [poUsePipes];
    Process.Execute;
    output:=Process.Output.ToString;
    Process.Free;
Но Process.Output.ToString сказал мне 'TInputPipeStream'... Вывода программы я так и не увидел.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.02.2017, 10:38
Ответы с готовыми решениями:

Запустить внешнее консольное приложение и вернуть результат
Здравствуйте. Подскажите, пожалуйста, как можно запустить внешнее консольное приложение без...

Запустить приложение на сервере и передать ему файл из ASP-формы
ЖИЗНЕННО_НЕОБХОДИМО!!! Есть проблема... Необходимо запустить приложение на серваке и передать ему...

Как запустить внешнее консольное приложение и получить то, что будет выведено на экран?
Есть программка которая распознает капчу, когда я ее запускаю из командной строки выводится...

Передать параметры в командную строку и перехватить результат обратно в приложение
Дорого времени суток! Есть небольшая задача: необходимо из C# приложения вызвать выполнение...

8
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32955 / 21273 / 8168
Регистрация: 22.10.2011
Сообщений: 36,542
Записей в блоге: 8
03.02.2017, 14:45 2
Цитата Сообщение от Andrew Puchinin Посмотреть сообщение
Но Process.Output.ToString сказал мне 'TInputPipeStream'
Правильно сказал. Нужно брать вот так:
Pascal
1
2
3
4
5
var SL : TStringList;
// ...
  SL := TStringList.Create;
  SL.LoadFromStream(Process.Output);
  output := SL.Text;
0
2 / 5 / 1
Регистрация: 25.04.2016
Сообщений: 125
03.02.2017, 15:06  [ТС] 3
Тоже уже пробовал, теперь стопорится на SL.LoadFromStream(Process.Output)...

Добавлено через 5 минут
Уже залез внутрь LoadFromStream():
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
Procedure TStrings.LoadFromStream(Stream: TStream);    
Const
  BufSize = 1024;
  MaxGrow = 1 shl 29;
 
Var
  Buffer     : AnsiString;
  BytesRead,
  BufLen,
  I,BufDelta     : Longint;
begin
  // reread into a buffer
  try
    beginupdate;
    Buffer:='';
    BufLen:=0;
    I:=1;
    Repeat
      BufDelta:=BufSize*I;
      SetLength(Buffer,BufLen+BufDelta);
      BytesRead:=Stream.Read(Buffer[BufLen+1],BufDelta);
      inc(BufLen,BufDelta);
      If I<MaxGrow then
        I:=I shl 1;
    Until BytesRead<>BufDelta;
    SetLength(Buffer, BufLen-BufDelta+BytesRead);
    SetTextStr(Buffer);
    SetLength(Buffer,0);
  finally
    EndUpdate;
  end;
end;
Как я понял, проблема в цикле - он не завершается. Почему, сказать не могу.

Добавлено через 3 минуты
Отдебажить функцию почему-то не дает
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32955 / 21273 / 8168
Регистрация: 22.10.2011
Сообщений: 36,542
Записей в блоге: 8
03.02.2017, 16:29 4
poWaitOnExit в опции процесса добавь, чтобы он завершился к тому моменту, как будет производиться чтение результатов его выполнения.
0
2 / 5 / 1
Регистрация: 25.04.2016
Сообщений: 125
03.02.2017, 17:00  [ТС] 5
Добавлял) Тогда тормозит на Process.Execute

Добавлено через 3 минуты
Давайте уточню: если моя сторонняя программа
Delphi
1
2
3
4
5
6
7
8
9
10
program project1;
 
var
  a,b: string;
 
begin
  read(a);
  read(b);
  writeln('!',a,',',b,'!');
end.
то Process.Parameters.Add('1 2') передаст нужные аргументы в стороннюю программу?..
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32955 / 21273 / 8168
Регистрация: 22.10.2011
Сообщений: 36,542
Записей в блоге: 8
03.02.2017, 17:10 6
Нет. Parameters - это параметры командной строки, которые читаются через ParamStr(...). А то, что ты хочешь прочесть через Read/ReadLn - это нужно писать в Process.Input (который как раз и присоединен к стандартному потоку ввода процесса)...
2
2 / 5 / 1
Регистрация: 25.04.2016
Сообщений: 125
03.02.2017, 17:36  [ТС] 7
О, класс, спасибо! А как его использовать, напишите, пожалуйста. Пробую два варианта:

Pascal
1
Process.Input:=exe_param;
и

Pascal
1
Process.Input(exe_param)
На второе говорит

Error: Illegal expression

на первое

Error: No member is provided to access property

Добавлено через 15 минут
Нашел:

Pascal
1
Process.Input.Write(exe_param,length(exe_param));
Только ран-тайм вылетает... SIGSEGV
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32955 / 21273 / 8168
Регистрация: 22.10.2011
Сообщений: 36,542
Записей в блоге: 8
03.02.2017, 19:10 8
Лучший ответ Сообщение было отмечено Andrew Puchinin как решение

Решение

Не знаю, что у тебя там вылетает, написал тестовую программу:
Pascal
1
2
3
4
5
6
7
var
  a, b : integer;
begin
  read(a);
  read(b);
  writeln('result = ', a + b);
end.
, и вот такой код:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
procedure TForm1.Button4Click(Sender: TObject);
var
  P : TProcess;
  s : string;
  L : TStringList;
begin
  P := TProcess.Create(nil);
  P.Executable := 'F:\_Volvo\Programs\lazarus\lcl_04\040.exe';
  P.Options := [poUsePipes, poNoConsole];
  P.Execute;
  s := '2 5';
  P.Input.Write(s[1], Length(s));
  P.CloseInput;
 
  L := TStringList.Create;
  L.LoadFromStream(P.Output);
  Memo2.Lines.Add(L.Text);
  L.Free;
 
  P.Free;
end;
Нормально все выполняется, и результат заносится в Memo:
Миниатюры
Запустить внешнее приложение, передать ему параметры и получить результат  
1
2 / 5 / 1
Регистрация: 25.04.2016
Сообщений: 125
03.02.2017, 19:40  [ТС] 9
Да, спасибо, заработало. Надо было в опциях поставить poNoConsole и убрать poWaitOnExit.
0
03.02.2017, 19:40
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.02.2017, 19:40
Помогаю со студенческими работами здесь

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

Как java-приложение может попросить OS запустить внешнее приложение?
Как java-приложение может попросить OS запустить внешнее приложение?

Как из Vb.Net запустить внешнее приложение
Помогите пожалуйста новичку. Мне нужно из vb.net запустить Crystal Reports (не компонент vb) и...

Можно ли из стороннего приложения запустить Excel и передать ему макрос для выполнения
Можно ли из стороннего приложения запустить Excel и передать ему макрос для выполнения


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru