Chertenok.ru - все о программировании
Вход  |  Регистрация  |  Поиск 
Праздник
Завтра :

День славянской письменности и культуры


Про пайпы и AllocConsole


Новая тема  Ответить  Печать Предыдущая тема  Следующая тема
Автор Сообщение
Пол:Муж TuXAPuK
Великий гонщик

Предупреждений : 1
Возраст: 26
Знак зодиака: Рыбы
Зарегистрирован: 12.09.2005
Сообщения: 714
Откуда: Великий город Рига... =Ъ
СообщениеСб, 17-Янв-2009 10:24    Заголовок сообщения: Про пайпы и AllocConsole
Цитата

Возник такой щепетильный вопрос а как можно прочитать данные с StdOut консольного окна, созданного функцией AllocConsole? =(

Так как многие игровые сервера например тот-же Half Life создают свои окна через AllocConsole, и читать с них что-либо становится противной задачей...

Вот например :
delphi:
  1. program Project1;
  2. {$APPTYPE CONSOLE}
  3. begin
  4.  WriteLn('HelloWorld');
  5. end.


Запустив :
project1 > test.txt

В файле test.txt получаем текст HelloWorld

А вот запустив - такой вот код :
delphi:
  1.  
  2. program Project1;
  3. uses
  4.  Windows;
  5. begin
  6.  AllocConsole();
  7.  WriteLn('HelloWorld');
  8. end.


В файле получаем кукиш с маслом.


Я уже пытался по разному извратится, и через хук приконнектится, и по разному... Есть-ли вообще возможность хотя-бы через хук клонировать папйп и обрабатывать его своей программой?

_________________
В начало
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Hunter
Энтузиаст




Зарегистрирован: 14.09.2006
Сообщения: 349

СообщениеСб, 17-Янв-2009 22:06 
Цитата

Можно попробовать запустить консольную прогу из своей с переназначением стандартного ввода-вывода. Смотри CreateProcess() и инфу в инете на тему "перенаправление STDIO". Но там тоже есть свои подводные камни, некоторые проги используют внутренний буфер ввода-вывода. Это значит, что данные в STDIO появляются не в реальном времени, а при переполнении буфера или закрытии проги. Лекарство от этого я в свое время не нашел.
В начало
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Пол:Муж TuXAPuK
Великий гонщик

Предупреждений : 1
Возраст: 26
Знак зодиака: Рыбы
Зарегистрирован: 12.09.2005
Сообщения: 714
Откуда: Великий город Рига... =Ъ
СообщениеВс, 18-Янв-2009 22:23 
Цитата

Да нашол классный компонент... TDosCommand он переводит на себя весь IO но вот в dedicated сервер quake1 он сбрасывает в ошибку... =( Так как WinQuake использует KeyboardInput Events, а любой stdin глушится...


В Attach добовляю компонент... Просто понравился очень...

Добавлено спустя 5 минут 3 секунды:

Hunter писал(а):
Можно попробовать запустить консольную прогу из своей с переназначением стандартного ввода-вывода. Смотри CreateProcess() и инфу в инете на тему "перенаправление STDIO". Но там тоже есть свои подводные камни, некоторые проги используют внутренний буфер ввода-вывода. Это значит, что данные в STDIO появляются не в реальном времени, а при переполнении буфера или закрытии проги. Лекарство от этого я в свое время не нашел.
Слушай а не переводя STDIN можно только STDOUT захватывать? Просто STDIN мне не нужен. Всего лишь сервис статистики написать....


DosCommand.pas.txt
 Описание:
Для установки переименовать .pas.txt в .pas и добавить $(DELPHI)libdclusr.dpk и откомпелить...

Скачать
 Имя файла:  DosCommand.pas.txt
 Размер:  20.96 KB
 Загружен:  243 раз(а)


_________________
В начало
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
СообщениеВс, 18-Янв-2009 23:36 
Цитата

Цитата:
Слушай а не переводя STDIN можно только STDOUT захватывать? Просто STDIN мне не нужен. Всего лишь сервис статистики написать....


Можно. Более того, при переводе STDIO мы получаем по два хендла на каждый пайп (на оба конца), а для перехвата нужен только один.
В начало
Показать сообщения:   
Страница 1 из 1
Перейти:  
Новая тема  Ответить  Печать

Вы можете начинать темы
Вы можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете присоединять файлы в этом форуме
Вы можете скачивать файлы в этом форуме
хостинг от .masterhost 
Rambler's Top100