![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
GUI (redirect output from console application) [D7, WinXP]
AGGRESSOR © (2007-04-07 22:19:00)Приветствую мастеров!
Задался целью написать оболочку к одному CLI-приложению. Есть 2 режима, в которых мне нужно получать output из приложения:
1) RunStr:='D:\lame.exe --help';
2) RunStr:='D:\lame.exe --h 1.wav 1.mp3';
С первым проблем никаких нет, в то время как второй ничего не возвращает. Вот собственно процедура:
procedure TestRun;
var
RunStr: string;
pi: TProcessInformation;
WriteHandle, ReadHandle: THandle;
Buffer: array [0..1024*255] of char;
bytesread: dword;
SA: TSecurityAttributes;
sui: _STARTUPINFOA;
begin
with SA do
begin
nLength:= Sizeof(SA);
bInheritHandle:= true;
lpsecuritydescriptor := nil;
end;
CreatePipe(ReadHandle, WriteHandle, @SA, 0);
FillChar(pi, sizeof(TProcessInformation), 0);
FillChar(sui, sizeof(TStartupInfo), 0);
sui.cb:= sizeof(TStartupInfo);
sui.hstdoutput:=WriteHandle;
sui.hStdError:=WriteHandle;
sui.hstdinput:=ReadHandle;
sui.dwflags:=startf_usestdhandles + startf_useshowwindow;
sui.wShowWindow:=SW_HIDE;
CreateProcess(nil,pchar(Runstr), @SA, @SA, True, NORMAL_PRIORITY_CLASS, nil, nil, sui, pi);
CloseHandle(WriteHandle);
Memo1.Clear;
Timer1.Enabled:=True;
end;
procedure OnTimer;
begin
bytesread := 0;
readfile(ReadHandle, buffer, SizeOf(buffer), bytesread, nil);
Memo1.text := Memo1.text + string(buffer);
buffer:=chr(0);
If
WaitForSingleObject(pi.hProcess,0)=WAIT_OBJECT_0
then begin
Timer1.Enabled:=False;
CloseHandle(pi.hProcess);
closehandle(pi.hthread);
closehandle(ReadHandle);
end;
end;
Вариант с таймером- как временная замена нити, чтобы форма могла нормально отрисовываться.
Так вот, для RunStr№1 все работает как часы, а для №2 (собственно вывод статистики в консоль) я не получаю ничего. Кто может подсказать, в чем дело?
Aggressor (2007-04-10 00:52:00) [1]Всем спасибо, решение найдено.
Aggressor (2007-04-08 15:13:00) [2]2 Leonid Troyanovsky:
Читать экранный буфер консоли- это выход, но для этого надо вызывать AllocConsole, а для GUI это неприемлимо (т.к. вызывать ее невидимой я не умею)
Leonid Troyanovsky (2007-04-08 10:43:00) [3]
> AGGRESSOR © (07.04.07 23:46) [2]
> Мне ничего писать не надо.
Попробуй примерно так:
http://groups.google.com/group/fido7.ru.delphi/msg/513bc431c0f102f5
--
Regards, LVT.
AGGRESSOR (2007-04-07 23:46:00) [4]Мне ничего писать не надо. Как создание дополнительного обратного пайпа может повлиять на работоспособность прямого?
Чапаев (2007-04-07 23:31:00) [5]> CreatePipe(ReadHandle, WriteHandle, @SA, 0);
Фигня. Нужно создавать минимум два анонимных пайпа. "Выход" одного подаёшь на stdin программы, а во "вход" пишешь. И наоборот, "вход" второго приделываешь к stdout и stderr, а с "выхода" читаешь, что программа выводит на консоль.