![]() ![]() |
| hardcase |
27.04.2006 9:30
Сообщение
#1
|
![]() code warrior ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 484 Пол: Мужской Реальное имя: Славен Репутация: 8 |
Перенаправляю ввод\вывод с консоли в безымянные программные каналы (anonymous pipes) - "святая троица" соответственно StdIn, StdOut, StdErr. И показываю всё это добро на текстарии.
Вот ситуация: cmd.exe возвращает свой вывод в OEM-кодировке с псевдографикой, но проблема не в этом, проблема в том, что некоторые программы, запущенные из под cmd-шника выводят в в нормальной кодировке 1251 (или какая там CP). Кроме того, cmd почему-то ДУБЛИРУЕТ input и выбрасывает его в output. Кто может подсказать, как с этим броться? Я так думаю, нужно ловить дебаг-событие запуска программы из cmd и в какой-то форме спрашивать пользователя, нужно ли показывать input юзверя в текстарии (или может прога дублирует input в output) а также какую CP использовать для отображения текста - ANSI или OEM. -------------------- ИзВ ин ИтЕ зА нЕ рОв НЫй П оч ЕРк
|
| Призрак |
27.04.2006 9:51
Сообщение
#2
|
|
Пионер ![]() ![]() Группа: Пользователи Сообщений: 69 Пол: Мужской Реальное имя: Антон Репутация: 0 |
Перенаправляю ввод\вывод с консоли в безымянные программные каналы (anonymous pipes) - "святая троица" соответственно StdIn, StdOut, StdErr. И показываю всё это добро на текстарии. Вот ситуация: cmd.exe возвращает свой вывод в OEM-кодировке с псевдографикой, но проблема не в этом, проблема в том, что некоторые программы, запущенные из под cmd-шника выводят в в нормальной кодировке 1251 (или какая там CP). Кроме того, cmd почему-то ДУБЛИРУЕТ input и выбрасывает его в output. Кто может подсказать, как с этим броться? Я так думаю, нужно ловить дебаг-событие запуска программы из cmd и в какой-то форме спрашивать пользователя, нужно ли показывать input юзверя в текстарии (или может прога дублирует input в output) а также какую CP использовать для отображения текста - ANSI или OEM. Если честно ничего не понял...Подробнее обьясни.. |
| hardcase |
27.04.2006 15:38
Сообщение
#3
|
![]() code warrior ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 484 Пол: Мужской Реальное имя: Славен Репутация: 8 |
Так, с дублированием input-a в cmd я разобрался - ключ /q позволяет отключать это безобразие (/q - echo off)
Объясняю подробнее (а чего конкренто не понятно?). Написал программу (вернее это только небольшой кусок большей) которая перенаправляет стандартный ввод/вывод у порождаемого дочернего процесса, коим является cmd.exe. Ввод/вывод отображаю не в текстовом режиме, а в графическом - на текстарии (конкретне - на SynEdit"е - он с OEM дружит и псевдографику отображает). Cmd возвращает результаты своих встроенных команд в OEM кодировке, поэтому я и ставлю OEM_CHARSET на контроле. Проблемы начинаются когда в cmd запускаются консольные программы, которые возвращают текст (русский) в нормальной кодировке. Если в системном окне консоли они неким волшебным образом отображаются корректно, то у меня абракадарба. Например ipconfig /all возвращает у меня дату выдачи IPшника с названием месяца по русски. В консоли написано - апрель, а в моём контроле - чертечто. -------------------- ИзВ ин ИтЕ зА нЕ рОв НЫй П оч ЕРк
|
| Призрак |
27.04.2006 23:25
Сообщение
#4
|
|
Пионер ![]() ![]() Группа: Пользователи Сообщений: 69 Пол: Мужской Реальное имя: Антон Репутация: 0 |
Вот с этого и надо было начинать что ты написал прогу
|
| GoodWind |
28.04.2006 6:16
Сообщение
#5
|
![]() Автооответчик ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 1 188 Пол: Мужской Реальное имя: Александр Репутация: 16 |
почему-то мне кажется, что теме место либо в Теории, либо в Задачах....
-------------------- Неадекватная чушь может быть адекватным ответом на неадекватный вопрос. Понятно или разжевать?
|
| hardcase |
28.04.2006 9:18
Сообщение
#6
|
![]() code warrior ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 484 Пол: Мужской Реальное имя: Славен Репутация: 8 |
Да, проблемы - с кодировкой. Вернее не совсем с кодировкой.
Мне нужно как-то отличать программы, которые могут выбрасывать в стандартный поток ANSI-символы. Это можно выяснить анализируя исполняемый файл (язык и т.д.) или придётся спрашивать пользователя? P.S. Как поймать запуск приложения из cmd - я знаю. -------------------- ИзВ ин ИтЕ зА нЕ рОв НЫй П оч ЕРк
|
| GoodWind |
28.04.2006 9:31
Сообщение
#7
|
![]() Автооответчик ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 1 188 Пол: Мужской Реальное имя: Александр Репутация: 16 |
я вот что думаю... ведь есть же программы (текстовые редакторы), которые сами определяют кодировку....
может тебе стоит копать в эту сторону ? -------------------- Неадекватная чушь может быть адекватным ответом на неадекватный вопрос. Понятно или разжевать?
|
| GoodWind |
28.04.2006 9:47
Сообщение
#8
|
![]() Автооответчик ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 1 188 Пол: Мужской Реальное имя: Александр Репутация: 16 |
http://denisov.i2x2.ru/delphi/bibl/Algoritm/AutoSelect.htm
здесь есть краткое описание алгоритма... наверное можно пропустить выходной поток через "фильтр", который будет определять кодировку, преобразовывать в нужную тебе и передавать его дальше. вот нашел модуль, может пригодится.
xlat.zip ( 1.85 килобайт )
Кол-во скачиваний: 375-------------------- Неадекватная чушь может быть адекватным ответом на неадекватный вопрос. Понятно или разжевать?
|
| hardcase |
28.04.2006 15:50
Сообщение
#9
|
![]() code warrior ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 484 Пол: Мужской Реальное имя: Славен Репутация: 8 |
Ооо. Пасиб за ценные ссылки.
Сейчас попробую прикрутить к программе. >добавлено позже: Впихнул xlat. Он в принципе работает, но и заменяет символы псевдографики. Вообщем, я так решил - к чёрту кодировки. Прога и так справляется со всем, что нужно. Сообщение отредактировано: hardcase - 28.04.2006 17:51 -------------------- ИзВ ин ИтЕ зА нЕ рОв НЫй П оч ЕРк
|
![]() ![]() |
|
Текстовая версия | 10.12.2025 4:46 |