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

Тема в разделе "Delphi - Система", создана пользователем jack, 22 ноя 2005.

Статус темы:
Закрыта.
  1. jack

    jack Гость

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

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

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

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

    zubr Гость

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

    jack Гость

    <!--QuoteBegin-zubr+22:11:2005, 23:06 -->
    <span class="vbquote">(zubr @ 22:11:2005, 23:06 )</span><!--QuoteEBegin-->
    Код (Text):
    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 требует постоянного управление через входной поток, плюс выводит графику в зависимости от введенной команды.

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

    zubr Гость

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

    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() будет по-другому, вечером проверю.
     
  6. jack

    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 не запускается. А у тебя работает?
     
  7. zubr

    zubr Гость

    Сделай вот так:
    Код (Text):
    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;
    Все должно работать.
     
  8. ????

    ???? Гость

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

    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. Наверное, по нему можно получить доступ к окну программы и, если оно консольное, попытаться периодически читать текст. Ну это я сам поищу... спасибо :)
     
  10. zubr

    zubr Гость

    Ну можно попробовать запускать cmd с разными параметрами, в Help на винду есть описание параметров.

    Ну можно юзать ReadProcessMemory, но гиморно. Или перехватывать WriteFile, что тоже гиморно, хотя может и проще чем отсортировывать из ReadProcessMemory.
     
  11. jack

    jack Гость

    Спасибо :)
    Поищу, если удастся решить, то напишу
     
Загрузка...
Статус темы:
Закрыта.

Поделиться этой страницей