Главная страница
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.04 c
14-1093198970
Константинов
2004-08-22 22:22
2004.09.12
DVD фильмы


1-1093386476
3APA3A
2004-08-25 02:27
2004.09.12
2 дополнительных потока при использовании TActionManager


4-1091046751
sid
2004-07-29 00:32
2004.09.12
File Access Control


1-1093518207
D3viL
2004-08-26 15:03
2004.09.12
Спасите Памагити!!!


1-1093360476
appendix
2004-08-24 19:14
2004.09.12
синхронизация stringgrid