Главная страница
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.051 c
6-1089111155
fylhtq
2004-07-06 14:52
2004.09.12
Invalid pointer operation при пинге - в чем засада?


3-1092395223
REA
2004-08-13 15:07
2004.09.12
Маленький ComboBox


14-1092761103
KaLLeKa
2004-08-17 20:45
2004.09.12
Подскажите плийз, я в железе ничего не понимаю...


14-1093355242
saNat
2004-08-24 17:47
2004.09.12
DOS и Windows


1-1093798757
Stas_on
2004-08-29 20:59
2004.09.12
Как зарегистрировать своё расширение из Delphi