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

Вниз

Поток консольного приложения   Найти похожие ветки 

 
Hyboid   (2004-07-31 20:24) [0]

Необходимо запустить консольное приложение и перехватить его выходной поток, т.е. чтобы результаты не выводились на экран, а передавались родительской программе. Т.е. примерно как веб-сервер: запускает программу, ждет завершения работы, обрабатывает результаты и т.д.


 
Evgeny V ©   (2004-08-02 07:36) [1]

Смотри в  SDK CreateProcess и CreatePipe и соответственно ReadFile и WriteFile (если надо и писать в консоль), для ожидания завершения задачи WaiForSingleObject, в котором объектом ожидания (сигнализации)  будет хэндл созданного процесса


 
Ajax ©   (2004-08-02 08:02) [2]

Код взят с Королевства:

function RunAny(CommandLine: string; Str: TStrings): boolean;
var
  I: byte;
  S: string;
  Flag: boolean;
  tRead, cWrite, dwRead, dwAvail: cardinal;
  SA: TSecurityAttributes;
  PI: TProcessInformation;
  SI: TStartupInfo;
begin
  Result:=False;
  SA.nLength:=SizeOf(SECURITY_ATTRIBUTES);
  SA.bInheritHandle:=True;
  SA.lpSecurityDescriptor:=nil;
  if not CreatePipe(tRead, cWrite, @SA, 0) then Exit;
  ZeroMemory(@SI, SizeOf(TStartupInfo));
  SI.cb:=SizeOf(TStartupInfo);
  SI.dwFlags:=STARTF_USESTDHANDLES or STARTF_USESHOWWINDOW;
  SI.wShowWindow:=SW_HIDE;
  SI.hStdOutput:=cWrite;
  if CreateProcess(nil, PChar(CommandLine), nil, nil, True, 0, nil, nil, SI, PI) then begin
     CloseHandle(PI.hProcess);
     CloseHandle(PI.hThread);
     Str.Clear();
     Flag:=True;
     while Flag do begin
        for I:=0 to 9 do begin
           PeekNamedPipe(tRead, nil, 0, nil, @dwAvail, nil);
           if (dwAvail>0) then begin
              Flag:=True;
              Break;
           end
           else Flag:=False;
           Sleep(100);
        end; //for I:=
        if dwAvail>0 then begin
           SetLength(S, dwAvail);
           ReadFile(tRead, PChar(S)^, Length(S), dwRead, Nil);
           OemToChar(PChar(S), PChar(S));
           Str.Add(S);
           Application.ProcessMessages;
           Result:=True;
        end; // if dwAvail
     end;    // while Flag
  end;       // if CreateProcess
end;

Сам не тестил.



Страницы: 1 вся ветка

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

Наверх




Память: 0.47 MB
Время: 0.033 c
8-1088161023
SeVa
2004-06-25 14:57
2004.09.12
Быстрая отрисовка на Canvas


4-1091164721
wild_arg
2004-07-30 09:18
2004.09.12
Контекстное меню


1-1093616435
Pashkerton
2004-08-27 18:20
2004.09.12
TrayIcon в ServiceApplication пропадает при перезагрузке


1-1093361023
Nat
2004-08-24 19:23
2004.09.12
Click по dbGrid


14-1093417129
Григорьев Антон
2004-08-25 10:58
2004.09.12
С винила на компакт