![]() |
Модераторы: Vitalik |
![]() ![]() ![]() |
|
Vit |
|
|||
![]() Vitaly Nevzorov ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 10964 Регистрация: 25.3.2002 Где: Chicago Репутация: нет Всего: 207 |
Работая над GoldenPen решил прикрутить к нему виндовый терминал, получился компонент, основную функциональность cmd.exe вроде обеспечивает.
В прикреплённых файлах - полные тексты исходников Присоединённый файл ( Кол-во скачиваний: 46 ) ![]() -------------------- With the best wishes, Vit I have done so much with so little for so long that I am now qualified to do anything with nothing Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru |
|||
|
||||
Vit |
|
|||
![]() Vitaly Nevzorov ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 10964 Регистрация: 25.3.2002 Где: Chicago Репутация: нет Всего: 207 |
Вот пример exe с компонентом:
Присоединённый файл ( Кол-во скачиваний: 64 ) ![]() -------------------- With the best wishes, Vit I have done so much with so little for so long that I am now qualified to do anything with nothing Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru |
|||
|
||||
Vitalik |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Координатор проекта Сообщений: 653 Регистрация: 8.11.2004 Где: Ukraine, Kharkov Репутация: 9 Всего: 12 |
Прикольная вещь!
![]() Только туда бы еще подсветку ![]() ![]() Тогда бы было совсем супер! ![]() |
|||
|
||||
Vit |
|
|||
![]() Vitaly Nevzorov ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 10964 Регистрация: 25.3.2002 Где: Chicago Репутация: нет Всего: 207 |
Компонент ещё сыроват, но я в общем-то задавался целью не создать компонент на все случаи жизни, а обеспечить минимальные нужды для себя. Если есть желающие его отрехтовать - буду только рад. Вот перечень проблем которые мной не были решены:
1. Select/Paste - не решил из-за лени, сейчас компоеннт разрешает двигать курсор только в пределах текущей строки. Нужно добавить режим "селекта" когда разрешено выделение по всему тексту, возможно скрывать каретку на время этого режима 2. События на посылку команды и получение результатов - лень было возится, реализуется очень просто 3. Нет нормальной реализации Ctrl-C/Ctrl-Break - пока убиваю процесс, но это не корректно! Надо посылать терминалу контрол-событие, но с теми двумя API для этого с бубном попрыгал, с разгону не получилось, тратить время было жаль. 4. Свойство - Lines надо бы сделать Read-Only, но в SynEdit метод SetLines во-первых почему-то статический, а во вторых объявлен как Private... Блин, проще наверное разработчикам написать, иначе бубун нужен будет просто колласальных размеров 5. Теоретически если консольное приложение зависнет то и вся прога повиснет, что не есть хорошо... В thread что-ли его пустить?... 6. Нет нормального Completition - я основную функциональность сделал, но надо бы подточить. 7. Нет реакции на F2, F8 и т.п. как в cmd 8. Не пойму, почему странно ведут себя переносы строк. В cmd команды Ping и Ping yahoo.com Выглядят нормально, а у меня по разному. 9. По ходу дела так и не понял каким шрифтом рисуют в cmd - похоже чем-то самопальным, такого шрифта вообще в системе нет! 10. Как отличить консольное приложение от неконсольного. При запуске консольного его надо запускать скрытым и перехватывать вывод, а при запуске оконного - его просто запускать видимым и прекращать что-либо перехватывать. Тут бубун зарыт вот где: если определять консольность до запуска, то надо точно локализовать что именно будет запускаться, например на команду "notepad" реально запускается "c:\windows\notepad.exe", если же определять после запуска программы то надо по handle найти путь к программе или каким-то другим способом установить тип программы. 11. Ну и последнее - наверное нужен перехват и обработка входного канала тоже, например если консольная прога запросит чего-то, то сейчас это никак нельзя ввести. Небольшой глюк: как правильно обработать запуск файлов по ассоциациям? -------------------- With the best wishes, Vit I have done so much with so little for so long that I am now qualified to do anything with nothing Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru |
|||
|
||||
s-mike |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 425 Регистрация: 16.1.2005 Где: Киев Репутация: нет Всего: 16 |
Вот хороший компонент для перехвата консольного вывода, может пригодится
![]() Присоединённый файл ( Кол-во скачиваний: 28 ) ![]() |
|||
|
||||
Vit |
|
|||
![]() Vitaly Nevzorov ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 10964 Регистрация: 25.3.2002 Где: Chicago Репутация: нет Всего: 207 |
Сейчас посмотрим, может я велосипед изобретал
![]() Добавлено @ 21:16 Нет, не велосипед, хотя кое что из этого компонента можно взять на вооружение. Спасибо, s-mike! -------------------- With the best wishes, Vit I have done so much with so little for so long that I am now qualified to do anything with nothing Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru |
|||
|
||||
Петрович |
|
||||||||||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1000 Регистрация: 2.12.2003 Где: Москва Репутация: нет Всего: 55 |
Тут наверное незачем изобретать велосипед. Есть вполне грамотные реализации функции запуска приложений, перехвата их вывода и подачи ввода на их вход. В качестве примера, могу привести компонент TVirtualRedirector из пакета VirtualShellTools. Там грамотно реализована работа с отдельным потоком, обрабатывающем пайпы. Кроме того, он учитывает специфику Win9x/WinNT. А вообще, попутно, в твоей реализации неправильно организуется работа с пайпами. Во первых, ты "закорачиваешь" вывод запускаемой программы на ее ввод, что естественно не правильно. Для ввода и вывода должны использоваться раздельные пайпы. Кроме того, нужен еще один пайп для стандартного потока ошибок (ErrorOut). Его тоже программы иногда используют для вывода сообщений об ошибках.
Проблема в том, что некоторые команды завершают строку последовательностью ^M^M^J. Для правильного терминала, любое число последовательных ^M эквивалентно единственному ^M. Т.к. ^M это всего навсего команда "переместить курсор в начало текущей строки". Соответственно, ^J, для правильного терминала, команда "переместить курсор на следующую строку, не изменяя позиции в строке". Естественно, по логике надо полностью эмулировать работу терминала. Дело в том, что некоторые программы (например мои ![]()
Кажется, cmd использует шрифт Terminal. Однако, не совсем понятно как он выбирает его размер, поскольку этот шрифт матричный, и имеет несколько размеров знакоместа.
Точно не помню, но в заголовке EXE-файла кажется есть битик, обозначающий консольное приложение. Насколько помню, где-то читал что система по нему определяет что при запуске такой программы, для нее необходимо создать консольное окно. Правда, естественно можно предположить существование виндовых программ которые сами создают себе консольное окно. Я лично таких не встречал. Добавлено @ 12:49 Да, забыл. Еще, у тебя там не очень корректно отслеживается комманда cd и подобные. В RunDosInMemo: pos('cd ', lowercase(CmdLine))>0 и т.п. Нельзя просто проверять на >0. Это приводит к ошибкам если в аргументах какой либо комманды встретится 'cd ' и т.п. Например Dir "cd 1" Ну и большие проблемы с запуском DOS-приложений. Процессы ntvdm плодятся, а вывод не перехватывается! Это сообщение отредактировал(а) Петрович - 19.9.2005, 12:42 -------------------- Все знать невозможно, но хочется |
||||||||||||
|
|||||||||||||
![]() ![]() ![]() |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | SynUniHighlighter и SynEdit | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |