Форум: "WinAPI";
Текущий архив: 2007.10.07;
Скачать: [xml.tar.bz2];
Вниз
GUI (redirect output from console application) Найти похожие ветки
← →
AGGRESSOR © (2007-04-07 22:19) [0]Приветствую мастеров!
Задался целью написать оболочку к одному 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 (собственно вывод статистики в консоль) я не получаю ничего. Кто может подсказать, в чем дело?
← →
Чапаев © (2007-04-07 23:31) [1]> CreatePipe(ReadHandle, WriteHandle, @SA, 0);
Фигня. Нужно создавать минимум два анонимных пайпа. "Выход" одного подаёшь на stdin программы, а во "вход" пишешь. И наоборот, "вход" второго приделываешь к stdout и stderr, а с "выхода" читаешь, что программа выводит на консоль.
← →
AGGRESSOR © (2007-04-07 23:46) [2]Мне ничего писать не надо. Как создание дополнительного обратного пайпа может повлиять на работоспособность прямого?
← →
Leonid Troyanovsky © (2007-04-08 10:43) [3]
> AGGRESSOR © (07.04.07 23:46) [2]
> Мне ничего писать не надо.
Попробуй примерно так:
http://groups.google.com/group/fido7.ru.delphi/msg/513bc431c0f102f5
--
Regards, LVT.
← →
Aggressor © (2007-04-08 15:13) [4]2 Leonid Troyanovsky:
Читать экранный буфер консоли- это выход, но для этого надо вызывать AllocConsole, а для GUI это неприемлимо (т.к. вызывать ее невидимой я не умею)
← →
Aggressor © (2007-04-10 00:52) [5]Всем спасибо, решение найдено.
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2007.10.07;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.051 c