|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
07.12.2018, 15:42 | #1 |
Пользователь
Регистрация: 20.10.2018
Сообщений: 16
|
Запуск стороннего приложения из под моему и перехват управления первого
В общем у меня есть 2 программки: моя (имеется исходники) и программка--клиент (исходников которой у меня нет), которая нужна чтобы моя программа удачно конектилась к определенному серверу
т.е. для корректной работы моей программы, все время сначала запускаю эту программу-клиент вручную, затем мою. проблема в том, что моя программа осуществляет сразу несколько соединений с определенным сервером, а программа-клиент поддерживает только 1 соединение через определенный порт, который каждый раз нужно задавать вручную в этой самой программе-клиенте. мне нужно как-то запихнуть эту программу-клиент в мою. я даже не знаю как это правильно назвать, наверно мне нужно запустить стороний exe файл (консольное приложение) из-под моего консольного приложения в соседнем потоке (так чтобы моя программа не останавливалась, пока работает программа-клиент). вот что мне подсказал гугл: Код:
так вот вопрос: как передать это число/строку моему запущенному процессу из под моей программы? возможно можно как-то сэмулировать ввод с клавы ? |
07.12.2018, 16:08 | #2 |
Старожил
Регистрация: 16.12.2011
Сообщений: 2,329
|
из командной строки запусти:
твоя-программа > вредная-программа-клиент где: твоя-программа должна сначала вывести в stdout номер порта, и дальше может делать все что захочет. вредная-программа-клиент считает из консоли это число (номер порта) так, словно ей в консольке кто-то его ввел вручную. |
07.12.2018, 19:25 | #3 |
Пользователь
Регистрация: 20.10.2018
Сообщений: 16
|
вот тут я не понял, нужно просто запустить мою программу? или именно через командую строку запустить мою, а затем программу-клиент?
если что, я пробовал запускать в одном потоке и мою программу и программу-клиент обычным способом (через system(path)) но передать порт с помощью cout << NPort << endl; мне не удалось, так как во после запуска программы-клиента - моя программа останавливается с концами (даже после ввода вручную порта в консоли) Последний раз редактировалось lallollulz; 08.12.2018 в 03:28. |
07.12.2018, 19:52 | #4 |
Старожил
Регистрация: 15.02.2010
Сообщений: 15,760
|
А ведь в офф доке есть не только описание нужных функций и их параметров, но даже и пример https://docs.microsoft.com/en-us/win...put-and-output . Ну кто ж ее читает...
|
08.12.2018, 18:33 | #5 | |
Пользователь
Регистрация: 20.10.2018
Сообщений: 16
|
Цитата:
но я столкнулся с трудностями, может я не выспался, я не пойму как передать строку в дочерное приложение не из буфера (не ввести), а заранее установленное, вот код Код:
Последний раз редактировалось lallollulz; 08.12.2018 в 18:37. |
|
08.12.2018, 19:02 | #6 |
Старожил
Регистрация: 15.02.2010
Сообщений: 15,760
|
Как ругается?
|
08.12.2018, 23:58 | #7 | |
Пользователь
Регистрация: 20.10.2018
Сообщений: 16
|
Код:
Цитата:
а нет, извиняюсь, все работало и работает, и передается то что нужно, но только после любого ввода в консоль (из-за специфики кода, я так понял) да, так и есть, эта тест программа состоит из цикла забора строки в буфер и отправки строки из буфера дочерному приложению, просто убрал забор для первого прогона цикла - и все оказалось норм. спасибо большое, я если честно и не расчитывал что это вообще можно реализовать без возможности изменить дочерное приложение, также переживал что эта моя программа-клиент принимает строку не сразу, а только спустя несколько секунд после запуска - однако все работает без каких-либо искуственных задержкек, с вариантом передачи строки сразу после запуска. еще раз спасибо Последний раз редактировалось lallollulz; 09.12.2018 в 00:24. |
|
09.12.2018, 10:26 | #8 |
Старожил
Регистрация: 15.02.2010
Сообщений: 15,760
|
Вы прочитали в хелпе по крейтпроцесс абзац про WaitForInputIdle?
|
09.12.2018, 10:37 | #9 |
Старожил
Регистрация: 13.07.2012
Сообщений: 6,342
|
|
10.12.2018, 13:12 | #10 |
Старожил
Регистрация: 16.12.2011
Сообщений: 2,329
|
почитай в интернетах, что такое "перенаправление ввода-вывода".
вся эта шляпа: Код:
объясняю на пальцах. допустим есть некоторая консольная утилитка. при запуске - пишет в консольку, что она делает. теперь, предположим, мы хотим её вывод направить не в консольку, а в файл. что бы по окончании работы утилитки, у нас на руках оказался текстовый файлик с логом работы. как это делается? запускаешь из командной строки: консольная утилита > report.log теперь, вместо того, что бы выводить информацию в консоль, утилита будет выводить весь текст в файл report.log вместо текстового файлика можно подсунуть другую программу. и тогда эта другая программа будет думать, что ей на вход пришли данные из входного потока: утилита1 > утилита2 здесь весь вывод данных из программы утилита1 пойдет на вход программы утилита2 соответственно, утилита2 будет думать, что ей кто-то чего-то в std::cin напечатал. пример: допустим, у нас есть консольная утилитка под названием cmdlog.exe её исходный код оч простой: Код:
благодаря чему информация логируется одновременно и в файл, и в консоль теперь запускаем любую утилиту, работу которой нужно залоггировать: Код:
которая весь свой вывод перенаправит на вход cmdlog.exe, которая выкачает весь ввод с помощью std::cin, выведет в консольку и сохранит в файле example.log Последний раз редактировалось _Bers; 10.12.2018 в 13:37. |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Запуск стороннего exe | Domenico | Visual C++ | 4 | 11.11.2018 21:53 |
Запуск стороннего приложения с параметрами | Romowski | Visual C++ | 2 | 08.01.2013 13:49 |
Скрытый запуск стороннего приложения | _ZixeL_ | Общие вопросы Delphi | 8 | 19.11.2012 20:22 |
значение из стороннего приложения | Wov | Общие вопросы Delphi | 4 | 01.03.2011 00:04 |
Запуск стороннего файла | CraftR14 | Общие вопросы Delphi | 8 | 17.04.2010 18:05 |