| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C++ Builder > Помогите с anonymous pipes |
| Автор: dbondar 18.6.2006, 12:14 | ||||
| Доброго времени суток! Дано: программа cmd.exe к примеру, необходимо написать оболочку к ней на C++ Builder, чтобы ст.вывод выводить в Мемо, а ст.ввод брать из Edit. Написал класс, приведенный ниже (точнее переделал взятый с форума). После нажатия кнопки СТАРТ произходит запуск дочернего процесса Pipes::Start(); и запуск 1 секундного таймера, по истечению которого производится Pipes::Read; и занесение в Мемо. Также имеется Edit. При вводе в него текста производится передача его по трубе к cmd.exe (Pipes::Write("command");). Собственно проблема: при запуске приложения и при старте дочернего процесса производится занесение информации в Мемо, затем в Edit пишу ping localhost [Enter] - крастоа! Работает! Еще раз пишу ту же строку - вот теперь выводиться в Мемо надпись "Продолжить?" и все. Если еще что нибуть отправить дочернему процессу, то он закроется. Помогите найти ошибку, уважаемые коллеги. Буду всем очень благодарен! Pipes.cpp:
Pipes.hpp:
|
| Автор: dumb 18.6.2006, 14:58 |
| WriteFile(write_stdin,buf,strlen(buf),&bread,NULL); |
| Автор: dbondar 18.6.2006, 15:05 |
| Сапсибо, с Вашей помощью нашел ошибку! Действительно. У меня же массив из 1024 символов!!! Вот так всегда. Зациклишься на одном месте и все тут. Возникла очередная проблема: С cmd.exe все в порядке, а вот приложение, для которого пренадназначалась оболочка работать отказывается! Дело в том, что это консольное приложение генерит свой курсор и постоянную строку вверху консоли. У меня не получается передать консоли нужные мне команды. Консольное приложение их просто игнорирует. Как быть, не подскажите? |
| Автор: dumb 19.6.2006, 01:28 |
| узнать как именно работает с консолью управляемое приложение. |
| Автор: dbondar 19.6.2006, 09:50 |
| Значит обнаружилось следующее: В обычном консольном приложении (cmd.exe) при нажатии клавиши производится немедленный вывод символа и затем автоповтор пока не отпустишь. В консольном приложении, под которое пишу оболочку несколько иначе. Нажимаешь клавишу - символ не выводится сколько бы эту клавишу не держать, а вот после отпускания он выводится на экран. Думаю, что из-за того, что в этом консольном приложении раз в секунду производится вывод информации в верхнюю строку консоли (которую я своей программой не ловлю почемуто), то и опрос клавиатуры сделан каим-то особым способом. Попутный вопрос: как можно запустить дочерний процесс (как в коде выше) так, чтобы его окно небыло скрыто, а отображалось одновременно с моей оболочкой. Это решит ряд вопросов. Спасибо. |
| Автор: dumb 19.6.2006, 13:33 |
| похоже, твое приложение работает не с stdin/stdout, а напрямую, через консольные функции. простым перенаправлением, соответственно, не отделаешься. чем "отделываться" я не подскажу - не в теме, сорри. |
| Автор: dbondar 19.6.2006, 15:50 |
| dumb, большое Вам спасибо. Проверьте пожалуйста почту. |