Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Поток консольного приложения [Win2k]


Hyboid ©   (2004-07-31 20:24:00) 

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


Ajax   (2004-08-02 08:02:00) [1]

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

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;

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


Evgeny V   (2004-08-02 07:36:00) [2]

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо