Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.144.253.161] |
|
Сообщ.
#1
,
|
|
|
Прочитать Console из Windows
...Пипл: ...уменя есть программа - консольная! ...Запущенна из Windows! ...Я узнаю ее HWND и THandle, ...мне нужно в TMemo или TStrings, передавать каждую секунду текстовое изображение находящиеся в ДАHHОМ открытом консольном приложении!?!??! ERrorMAKros |
Сообщ.
#2
,
|
|
|
А Вы ее сами запускаете, или кто-то из вне. Если сами, то можете переназначить ее в/в на Pipe'ы и вычитывать оттуда все что она выводит. Правда это не со всеми программами проходит, но с большинством все Ok. Если надо, могу рассказать поподробнее.
|
Сообщ.
#3
,
|
|
|
Расскажи Петрович )
|
Сообщ.
#4
,
|
|
|
...Да вообщем - дело вот в чем! ...в Windows запустили консольное приложение, ...появилось стандартное окошко, а котором определенная DOS программа (в текстовом режиме). Задача вот какая: ...Нужен исходник, который перехватит весь вид консольного окна и переместит его, скажем в TMemo. Т.е. весь текст в консольном приложении загнать в какую нибудь текстовую переменную, ...например TStrings! ...перехват текста! ...ну-же! ...программеры! ....давайте, поднажмите! ...вы же знаете!
P.S. Я получил HWND консольного окна, ....получил THandle! ...Даже ProcessID получил (потому, что консольную программу запускал из своего приложения путем createprocess). ...А дальше, все что в модуле windows, типа GetConsoleScreenBufferInfo или ReadConsole - тут уже не знаю что делать!!!! HEEEElp!! |
Сообщ.
#5
,
|
|||
|
Значится так. Есть такая библиотека, называется JVCL. Там есть компонент TJvCreateProcess Он-то и позволяет запускать DOS-приложения, и ксонсольные Win-приложения. При этом, он перехватывает весь вывод таких приложений, порождая соответствующие события. Более того, он даже позволяет посылать данные на вход таких приложений. В общем очень не плохой компонет. Правда сама библиотека JVCL весьма громоздка, и если требуется толко этот компонент проще выдернуть его модуль из библиотеки. Я использую его даже не устанавливая JVCL в Delphi, правда сам компонент создаю динамически, на этапе исполнения. Есть нечто попроще, называется DosCommand (брал по моему на torry). Это компонент живущий в отдельном модуле и для инсталяции ничего особенного не требующий. Однако, реализация этого компонент изобилует ошибками. Я в свое время на основе этого компонента создал свой, где вроде исправил все найденные мной ошибки. Однако, до полного завершения над компонентом работа не была доведена и учитывая то, что это было давно, я даже не уверен, все-ли ошибки я исправил . В общем есть старый текст моего компонента и тестовая программа которая позволяет воспользоваться любым из трех перечисленных компонентов. Если есть желание, могу кинуть, сами разбирайтесь . Но, не все так просто и красиво как кажется на первый взгляд. Насколько я помню, когда я разбирался со всем эти хозяйством то столкнулся с проблемой для которой не нашел универсального решения, в связи с чем и забросил работу на компонентом. Проблема в следующем: При работе под WinXP (и кажется под Win2k), при запуске DOS-приложения, через любой из указанных компонентов, не перехватывается го потоки! Причем, перехват в/в консольных Win-приложений проблем не вызывает. Под Won9x все нормально. На сколько я смог разобраться проблема состоит в том, что эмулятор DOS для WinXP (cmd.exe) не совсем корректно передает потоки в/в запускаемому приложению. Выход из положения есть. Если запускать DOS-приложение не напрямую, а через BAT-файл, то все получается. Например, если хочется запустить DOS-прогрммку 'Вася.exe' то запускать надо не ее, а файл 'Вася.bat' который должен содержать строку 'Вася.exe'. В этом случае, Cmd.exe ведет себя иначе, и все получается. Мне этот способ не нравится, хотя в частных случаях вполне применим. Да, и еще. Перехватить в/в консольной программы (в том-числе и DOS-программы) можно только в том случае если эта программа пользуется стандартными потоками в/в. Например, написанные на Borland Pascal программы (если они используют модуль CRT или подобные), по умолчанию не пользуются стандартными потоками. Чтобы они ими пользовались, надо в них сделать кое-что дополнительно. Проверить любую, выводящую строки, программу на выполнение этого условия можно элементарно. Например мы хотим проверить программу Вася.exe. Если мы знаем, что эта программа выводит некоторый текст и завершается при указании опции /? то, просто набираем коммандную строку (либо в TC, либо в пуск->выполнить) вида:
После завершения программы смотрим содержимое файла "петя.txt" Если там пусто, то программа не пользуется стандартными потоками, и перехват ее вывода описанным выше способом невозможен . Если-же там то, что вывела программа, то радуйтесь. Ну ладно, на первый раз хватит |
Сообщ.
#6
,
|
|||
|
for Петрович Выводит в файл но через поток никак у меня не получается может на мыло пошлеш |
Сообщ.
#7
,
|
|||
|
Вышлю, но наверное только завтра смогу (03.12.03). |
Сообщ.
#8
,
|
|
|
Очень извиняюсь. Поднял архив, и понял что мой модуль в "разобранном", недоделанном состоянии. Поэтому рекомендую пока воспользоваться JVCL, модуль JvSysComp, компонент TJvCreateProcess. Правда в него надо внести исправление:
В конструкторе 'constructor TJvReadThread.Create(AReadHandle, ADestHandle: THandle);' нужно закоментировать строку: 'Priority := tpLower;'. Если этого не сделать, поток TJvReadThread имеет приоритет ниже чем созданный процесс. Поэтому, если запускаемый процесс здорово "жрет" процессор (что характерно для DOS-программ), то потоку TJvReadThread иногда процессор вообще не достается. Проявляется это в том, что "перехвата" стандартного потока вывода иногда (у меня почти всегда) не происходит. И еще, напомню. Под WinNT, Win2k и WinXP DOS-программы приходится запускать через BAT-файл (см. мое сообщение от 1.12.03, 02:28). |