Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.10.07;
Скачать: CL | DM;

Вниз

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 вся ветка

Текущий архив: 2007.10.07;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.026 c
9-1160475693
grouzd)ev
2006-10-10 14:21
2007.10.07
Конкурсы по кодингу игр


1-1185306496
Dr. Andrew
2007-07-24 23:48
2007.10.07
[Warning] Crc32.pas(140): Variable InFile might not have been!


1-1185227514
Mitrofan
2007-07-24 01:51
2007.10.07
TThread ы и проблемы с ними же


2-1189415064
Washington
2007-09-10 13:04
2007.10.07
Кнопка выхода


15-1189275380
OlegZp
2007-09-08 22:16
2007.10.07
Помогите восстановить Internet Explorer