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

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


не читает результат работы консольной программы


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


Возраст: 28
Знак зодиака: Рыбы
Зарегистрирован: 21.08.2009
Сообщения: 1

СообщениеПт, 21-Авг-2009 11:50    Заголовок сообщения: не читает результат работы консольной программы
Цитата

procedure TForm1.Button1Click(Sender: TObject);
var ZapisanoBytes : Cardinal;
readpipe,writepipe: Thandle;
Security: TSecurityAttributes;
str:string;
start: TStartUpInfo;
ProcessInfo: TProcessInformation;

begin

with Security do
begin
nlength := SizeOf(TSecurityAttributes);
binherithandle := true;
lpsecuritydescriptor := nil;
end;
if CreatePipe(readPipe,writepipe,@Security,0) then
begin
FillChar(Start, Sizeof(Start), #0);
start.cb := SizeOf(start);
start.hStdOutput := WritePipe;
start.hStdInput := ReadPipe;
start.dwFlags := STARTF_USESTDHANDLES +
STARTF_USESHOWWINDOW;
start.wShowWindow := SW_show;

end;
ShowMessage('da');
if CreateProcess(nil,
'c:\cons.exe',
@Security,
@Security,
true,
NORMAL_PRIORITY_CLASS,
nil,
nil,
start,
ProcessInfo) then
begin

ShowMessage('da2');
ReadFile(readpipe, str, Length(str), ZapisanoBytes, Nil);
Memo1.Text:=str;
CloseHandle(ProcessInfo.hProcess);
CloseHandle(ProcessInfo.hThread);
CloseHandle(ReadPipe);
CloseHandle(WritePipe);
end;

end;
В начало
Посмотреть профиль Отправить личное сообщение
Хантер
Гость







СообщениеПт, 21-Авг-2009 14:27 
Цитата

Некоторые консольные проги буферизуют консольный вывод. Если есть исходник этой проги, можно заставить ее сбрасывать буфер. Если нет - ХЗ что делать, я в свое время решения не нашел. Есть еще обходные решения с проксирующим батником, но это как-то некошерно..
В начало
DrPass
Знающий :)
/Почетный Модератор/


Возраст: 31
Знак зодиака: Лев
Зарегистрирован: 02.05.2002
Сообщения: 5709
Откуда: Донецк
СообщениеПт, 21-Авг-2009 14:35 
Цитата

А еще некоторые консольные проги пишут в консоль не через стандартный поток ввода-вывода. Собственно, проверить это несложно:
program.exe > test.txt
Если чего-то записала, то все-таки работает через stdout

_________________
Да пребудет с вами Сила!
В начало
Посмотреть профиль Отправить личное сообщение
Пол:Муж TuXAPuK
Великий гонщик

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

DrPass правильно сказал, не все программы с врождённой консолью. То-есть у некоторых консоль создаётся через AllocConsole. Но в принципе исходный код иметь не обязательно можно подставить на такую программу Hook получить заголовки стандартных In/Out/Err с помощью GetStdHandle потом используя API хук (для новичков madCodeHook подойдёт) перехватывать функции WriteConsole, WriteConsoleOutput, WriteFile ... В принципе те кто знают о том как писать в консоль используя только WinAPI поняли о чём я говорю...

Подобный метод был проверен на HLDS и вполне работоспособен.

ps : HLDS - Half Life Dedicated Server

_________________
В начало
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Показать сообщения:   
Страница 1 из 1
Перейти:  
Новая тема  Ответить  Печать

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