Главная страница
    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.46 MB
Время: 0.051 c
15-1189290280
Kostafey
2007-09-09 02:24
2007.10.07
С днем рождения ! 9 сентября


3-1180579906
@dim
2007-05-31 06:51
2007.10.07
Блокировки в MS SQL


15-1189233132
AlexanderCoum
2007-09-08 10:32
2007.10.07
UnZip


8-1167300694
vrem
2006-12-28 13:11
2007.10.07
Mpeg2 в программе на дельфи


3-1180855837
npu3pak_kz
2007-06-03 11:30
2007.10.07
Копирование/перемещение строк в таблице MS Access





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский