Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.11.2023, 20:49   #1
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 627
По умолчанию Передача строки между программами

Задача такая:

Программа А запускает программу B, передаёт в нее строку и переходит в режим ожидания
Программа В принимает строку, совершает обработку и передаёт ее обратно в А, после чего закрывается

Программа А "оживает" после закрытия программы В
Kronos913 вне форума Ответить с цитированием
Старый 28.11.2023, 08:16   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Заполняете TStartupInfo, вызваете и читайте/пишите.
p51x вне форума Ответить с цитированием
Старый 28.11.2023, 11:35   #3
сфинкс
Форумчанин
 
Аватар для сфинкс
 
Регистрация: 17.06.2012
Сообщений: 957
По умолчанию

Строка сохраняется на диск и считывается

Совет прошлого века
Случайные и Массивы https://programmersforum.ru/showthread.php?t=344371 Учим C# & basic & excel & python https://programmersforum.ru/showthre...=327446&page=5 ничего нерекомендую
сфинкс вне форума Ответить с цитированием
Старый 28.11.2023, 12:05   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

сфинкс, это особенно актуально, если эточужая консольная программа...
p51x вне форума Ответить с цитированием
Старый 01.12.2023, 02:56   #5
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,872
По умолчанию

Цитата:
Сообщение от Kronos913 Посмотреть сообщение
Программа А запускает программу B, передаёт в нее строку и переходит в режим ожидания
Элементарно. Запуск программы с командной строкой параметров.
Режим ожидания тоже элементарно. Если программу не закрывать.

Цитата:
Сообщение от Kronos913 Посмотреть сообщение
Программа В принимает строку, совершает обработку и передаёт ее обратно в А, после чего закрывается
А вот тут уже сложнее. Как программе B узнать кто её вызвал? И как ей туда передать ответ?

Kronos913, вы на форуме не первый день. Может сформулируете нормальный вопрос не про сферического коня в вакууме?
northener вне форума Ответить с цитированием
Старый 01.12.2023, 08:56   #6
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Цитата:
Сообщение от northener Посмотреть сообщение
Запуск программы с командной строкой параметров.
А если это чужая консольная программа?

Цитата:
Сообщение от northener Посмотреть сообщение
Режим ожидания тоже элементарно. Если программу не закрывать.
Причем тут "если"?

Цитата:
Сообщение от northener Посмотреть сообщение
А вот тут уже сложнее. Как программе B узнать кто её вызвал? И как ей туда передать ответ?
Нет, не сложнее. Как консольные проги узнают кто их вызвал? Как они получают от пользователя ввод?

Цитата:
Сообщение от northener Посмотреть сообщение
Kronos913, вы на форуме не первый день. Может сформулируете нормальный вопрос не про сферического коня в вакууме?
А что вам не нравится в вопросе? Ответ дан во 2 посте темы, перенаправляете стандартные ввод/вывод и работаете.
p51x вне форума Ответить с цитированием
Старый 01.12.2023, 11:57   #7
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,551
По умолчанию

Функция для запуска приложения с параметрами, ожидания его завершения и получения кода возврата:
Код:
uses
  Windows;

function CmdExec(const Cmd: string): Integer;
// Выполнение консольного приложения с ожиданием его завершения и возвратом кода возврата
var
  Rlst: LongBool;
  StartUpInfo: TStartUpInfo;
  ProcessInfo: TProcessInformation;
  ExitCode: Cardinal;
begin
  FillChar(StartUpInfo, SizeOf(TStartUpInfo), 0); // заполнение структуры нулями
  with StartUpInfo do
  begin
    cb := SizeOf(TStartUpInfo);
    dwFlags := STARTF_USESHOWWINDOW or STARTF_FORCEONFEEDBACK;
    wShowWindow := SW_SHOWNORMAL;
  end;
  Rlst := CreateProcess(
      nil,
      PChar(Cmd), // команда
      nil,
      nil,
      False, // флаг наследования текущего процесса
      NORMAL_PRIORITY_CLASS, // флаги способов создания процесса
      nil,
      nil, // текущий диск и каталог
      StartUpInfo, // структура STARTUPINFO
      ProcessInfo // структура PROCESS_INFORMATION
    );
  if Rlst then begin // если запуск прошел успешно
    with ProcessInfo do begin
      WaitForInputIdle(hProcess, INFINITE); // ждем завершения инициализации
      WaitForSingleObject(hProcess, INFINITE); // ждем завершения процесса
      GetExitCodeProcess(hProcess, ExitCode); // получаем код завершения
      CloseHandle(hThread); // закрываем дескриптор процесса
      CloseHandle(hProcess); // закрываем дескриптор потока
    end;
  end else begin // ошибка выполнения команды
    WriteLn('Error: ', GetLastError, ' > ', Cmd);
    ExitCode := 0;
  end;
  Result := Integer(ExitCode); // возвращаем код возврата с приведением к типу Integer
end;
Пример использования:
Код:
var
  S: Integer;

begin
  S := CmdExec('program_b stroka');
  WriteLn(S);
  ReadLn;
end.
Arigato на форуме Ответить с цитированием
Старый 31.01.2024, 19:51   #8
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 627
По умолчанию

Цитата:
Сообщение от сфинкс Посмотреть сообщение
Строка сохраняется на диск и считывается

Совет прошлого века
У меня была схожая идея - просто clipboadr использовать. Но и проблема возникает очевидная - без спросу пользователя будет стираться то что там сохранено
Kronos913 вне форума Ответить с цитированием
Старый 31.01.2024, 19:52   #9
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 627
По умолчанию

Цитата:
Сообщение от northener Посмотреть сообщение
Режим ожидания тоже элементарно. Если программу не закрывать.
Как? Если я не знаю заранее как долго нужно ожидать
Kronos913 вне форума Ответить с цитированием
Старый 31.01.2024, 20:00   #10
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 627
По умолчанию

Arigato как я понял, то функция самого вызова, верно?
Тогда второй вопрос - как из программы В вернуть какую-то информацию?
Kronos913 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
C++, передача значения строки между функциями denkorg Общие вопросы C/C++ 2 17.12.2017 09:52
Выбор между программами Karfagen Свободное общение 4 02.03.2017 13:58
обмен данными между программами nestor_petrovitch Общие вопросы Delphi 3 05.02.2012 20:56
как реализовать обмен данными между программами Андрей.12 Работа с сетью в Delphi 1 26.11.2009 08:06
Обмен данными между двуми программами JRK_DV Помощь студентам 6 28.11.2008 00:18