| Автор
| Сообщение |
 mamedovvms
Новичок

Возраст: 28
Знак зодиака: 
Зарегистрирован: 21.08.2009
Сообщения: 1
|
|
|
Цитата |
|
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; |
|
| В начало |
|
 |
|
|
 |
|
|
|
Цитата |
|
| Некоторые консольные проги буферизуют консольный вывод. Если есть исходник этой проги, можно заставить ее сбрасывать буфер. Если нет - ХЗ что делать, я в свое время решения не нашел. Есть еще обходные решения с проксирующим батником, но это как-то некошерно.. |
|
| В начало |
|
 |
DrPass
Знающий :) /Почетный Модератор/

Возраст: 31
Знак зодиака: 
Зарегистрирован: 02.05.2002
Сообщения: 5709
Откуда: Донецк
|
|
|
Цитата |
|
А еще некоторые консольные проги пишут в консоль не через стандартный поток ввода-вывода. Собственно, проверить это несложно:
program.exe > test.txt
Если чего-то записала, то все-таки работает через stdout _________________ Да пребудет с вами Сила! |
|
| В начало |
|
 |
 TuXAPuK
Великий гонщик


Возраст: 26
Знак зодиака: 
Зарегистрирован: 12.09.2005
Сообщения: 714
Откуда: Великий город Рига... =Ъ
|
|
|
Цитата |
|
DrPass правильно сказал, не все программы с врождённой консолью. То-есть у некоторых консоль создаётся через AllocConsole. Но в принципе исходный код иметь не обязательно можно подставить на такую программу Hook получить заголовки стандартных In/Out/Err с помощью GetStdHandle потом используя API хук (для новичков madCodeHook подойдёт) перехватывать функции WriteConsole, WriteConsoleOutput, WriteFile ... В принципе те кто знают о том как писать в консоль используя только WinAPI поняли о чём я говорю...
Подобный метод был проверен на HLDS и вполне работоспособен.
ps : HLDS - Half Life Dedicated Server _________________
 |
|
| В начало |
|
 |
|