Управление консольным приложением

  • Автор темы jack
  • Дата начала
Статус
Закрыто для дальнейших ответов.
J

jack

Моя программа my.exe запускает через CreateProcess либо консольное приложение conp.exe, либо оконное winp.exe (на выбор пользователя). Если второе перед закрытием задает вопрос, то первое закрывается без предупреждения.

Подскажите, как мне отменить закрытие консольного приложения?

Мне нужен результат работы программы, который она выводит в окно. Перенаправлять вывод не могу, так как подразумевается диалог с пользователем и вывод графики через dos4gw.exe (который используется conp.exe), даже если смогу определить, что используется именно консольный тип.

Или, если конечно возможно, периодически копировать текст из окна консоли - ведь где-то он должен быть доступен.
 
Z

zubr

Код:
begin
......
Write('Для закрытия приложения нажмите Enter');
Readln;
end;
 
J

jack

<!--QuoteBegin-zubr+22:11:2005, 23:06 -->
<span class="vbquote">(zubr @ 22:11:2005, 23:06 )</span><!--QuoteEBegin-->
Код:
begin
......
Write('Для закрытия приложения нажмите Enter');
Readln;
end;
[snapback]27511" rel="nofollow" target="_blank[/snapback]​
[/quote]

Приложения conp.exe и winp.exe написаны не мной. Своей программой my.exe я их запускаю с помощью CreateProcess, жду завершения их работы и с некоторым интервалом обрабатываю события моей программы.

Оговорюсь, что winp.exe и conp.exe - это такие возможные типы приложений (оконное или консольное). И различие между ними в том, что winp.exe - это conp.exe обернутое в QuickWin. Но это не важно...

Я вижу пока два способы получить текст в окне conp.exe - отследить событие(?) закрытия консольного приложения и заморозить его, или регулярно читать текст из окна консольного приложения.

Ведь запуская conp.exe, например, через бат-файл с паузой в конце можно после завершения работы скопировать текст окна - значит где-то он должен быть доступен и во время работы.

Перенаправление через CreatePipe, думаю, невозможно поскольку программа conp.exe требует постоянного управление через входной поток, плюс выводит графику в зависимости от введенной команды.

Надеюсь какой-нибудь вариант возможен, ну или существует лучший способ.
 
Z

zubr

А если запускать cmd.exe (сеанс DOS) с параметром путь\conp.exe - conp.exe отработает, а текст который он выдает останется в консольном окне cmd.exe
 
J

jack

<!--QuoteBegin-zubr+23:11:2005, 11:30 -->
<span class="vbquote">(zubr @ 23:11:2005, 11:30 )</span><!--QuoteEBegin-->А если запускать cmd.exe (сеанс DOS) с параметром путь\conp.exe - conp.exe отработает, а текст который он выдает останется в консольном окне cmd.exe
[snapback]27522" rel="nofollow" target="_blank[/snapback]​
[/quote]

Я вот сейчас поробовал запустить в каталоге программы "cmd.exe conp.exe" и ничего не получил, также как для "cmd.exe ping.exe tut.by -t".

Может с CreateProcess() будет по-другому, вечером проверю.
 
J

jack

<!--QuoteBegin-zubr+23:11:2005, 11:30 -->
<span class="vbquote">(zubr @ 23:11:2005, 11:30 )</span><!--QuoteEBegin-->А если запускать cmd.exe (сеанс DOS) с параметром путь\conp.exe - conp.exe отработает, а текст который он выдает останется в консольном окне cmd.exe
[snapback]27522" rel="nofollow" target="_blank[/snapback]​
[/quote]
Не рабтает. Открывается окно cmd.exe и все. Программа conp.exe не запускается. А у тебя работает?
 
Z

zubr

Сделай вот так:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
st:_STARTUPINFOA;
pr:_PROCESS_INFORMATION;
begin
ZeroMemory(@st, sizeof(st));
st.cb:=SizeOf(st);
CreateProcess(nil, 'cmd.exe /k start /b путь\conp.exe', nil, nil, False,
0, nil, nil, st, pr);
end;
Все должно работать.
 
?

????

Для: jack
если совет zubr'а не поможет - приклей прогу к сообщению - попробуем побороть
 
J

jack

Для: zubr
Да, запускается. Но, к сожалению, cmd.exe перехватывает ввод и я не могу управлять conp.exe. Надо вначале выйти из cmd.exe набрав exit, и только после этого могу управлять conp.exe :(
Но все равно спасибо.

<!--QuoteBegin-????+27:11:2005, 07:31 -->
<span class="vbquote">(???? @ 27:11:2005, 07:31 )</span><!--QuoteEBegin-->если совет zubr'а не поможет - приклей прогу к сообщению - попробуем побороть
[snapback]27681" rel="nofollow" target="_blank[/snapback]​
[/quote]
Извини, но я не имею права распространять conp.exe - уголовно наказуемо...


Может все-таки как-нибудь через WinAPI? Я в нем вообще не разбираюсь, но у меня же есть хендл ProcInfo.hProcess. Наверное, по нему можно получить доступ к окну программы и, если оно консольное, попытаться периодически читать текст. Ну это я сам поищу... спасибо :)
 
Z

zubr

Да, запускается. Но, к сожалению, cmd.exe перехватывает ввод и я не могу управлять conp.exe. Надо вначале выйти из cmd.exe набрав exit, и только после этого могу управлять conp.exe
Ну можно попробовать запускать cmd с разными параметрами, в Help на винду есть описание параметров.

Может все-таки как-нибудь через WinAPI? Я в нем вообще не разбираюсь, но у меня же есть хендл ProcInfo.hProcess. Наверное, по нему можно получить доступ к окну программы и, если оно консольное, попытаться периодически читать текст. Ну это я сам поищу... спасибо
Ну можно юзать ReadProcessMemory, но гиморно. Или перехватывать WriteFile, что тоже гиморно, хотя может и проще чем отсортировывать из ReadProcessMemory.
 
J

jack

Спасибо :)
Поищу, если удастся решить, то напишу
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!