Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.45 MB
Время: 0.049 c
2-1189177170
Irish
2007-09-07 18:59
2007.10.07
Архиваторы.Увеличение скорости


2-1189265316
Антон Шестаков
2007-09-08 19:28
2007.10.07
Записать картинку в Paradox базу


3-1180465570
tarkus
2007-05-29 23:06
2007.10.07
Использование DISTINCT в LocalSQL


15-1188999922
Галинка
2007-09-05 17:45
2007.10.07
Прикол в Эклипсе


4-1175630984
LuceferAB
2007-04-04 00:09
2007.10.07
как показать форму не отбирая фокуса





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский