Показать сообщение отдельно
  #2  
Старый 07.02.2014, 14:59
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,907
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

*.bat точно можно, я запускал вот так:
Код:
procedure RunConsoleApplicationTime(CmdLine,Params:String;OutStrings:TStrings;TimeOut:DWORD);
var
  securityattributes: TSecurityAttributes;
  startupinfo: TStartupInfo;
  processinformation: TProcessInformation;
  hPipeInputRead: THandle;
  hPipeInputWrite: THandle;
  hPipeOutputRead: THandle;
  hPipeOutputWrite: THandle;
  WaitResult:Cardinal;
  AnsiBuf: TAnsiBuf;
  CharBuf: TCharBuf;
  dummy: Cardinal;
  s:string;
begin
  securityattributes.nLength:=SizeOf(TSecurityAttributes);
  securityattributes.lpSecurityDescriptor:=nil;
  securityattributes.bInheritHandle:=True;
  CreatePipe(hPipeInputRead, hPipeInputWrite, @securityattributes, 0);
  CreatePipe(hPipeOutputRead, hPipeOutputWrite, @securityattributes, 0);
  ZeroMemory(@startupinfo, SizeOf(TStartupInfo));
  ZeroMemory(@processinformation, SizeOf(TProcessInformation));
  with startupinfo do
    begin
      cb:=SizeOf(TStartupInfo);
      dwFlags:=STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;
      wShowWindow:=SW_HIDE;
      hStdInput:=hPipeInputRead;
      hStdOutput:=hPipeOutputWrite;
      hStdError:=hPipeOutputWrite;
    end;
  OutStrings.BeginUpdate;
  OutStrings.Append(CmdLine+' '+Params);
  OutStrings.EndUpdate;
  if CreateProcess(nil, PChar(CmdLine+' '+Params), nil, nil, True, CREATE_NEW_CONSOLE,
    nil, PChar(ExtractFileDir(CmdLine)), startupinfo, processinformation) then
    begin
      WaitResult:=WaitForSingleObject(processinformation.hProcess, TimeOut);
      if WaitResult=WAIT_TIMEOUT then
        begin
          if ReadFile(hPipeOutputRead, AnsiBuf, Length(AnsiBuf), dummy, nil) then
            begin
              AnsiBufToCharBuf(AnsiBuf, CharBuf, dummy);
              OutStrings.BeginUpdate;
              OutStrings.Text:=OutStrings.Text+Copy(CharBuf, 1, dummy);
              if Pos(#8,OutStrings.Text)>0 then  //<---------
                begin                            //<---------
                  s:=OutStrings.Text;            //<---------
                  Delete(s,Pos(#8,s)-3,4);       //<---------
                  OutStrings.Text:=s;            //<---------
                end;                             //<---------
              OutStrings.EndUpdate;
            end;
          OutStrings.Append('Выход по таймауту');
          TerminateProcess(processinformation.hProcess,0);
          Sleep(10000);
        end
      else
        begin
          if ReadFile(hPipeOutputRead, AnsiBuf, Length(AnsiBuf), dummy, nil) then
            begin
              AnsiBufToCharBuf(AnsiBuf, CharBuf, dummy);
              OutStrings.BeginUpdate;
              OutStrings.Text:=OutStrings.Text+Copy(CharBuf, 1, dummy);
              if Pos(#8,OutStrings.Text)>0 then  //<---------
                begin                            //<---------
                  s:=OutStrings.Text;            //<---------
                  Delete(s,Pos(#8,s)-3,4);       //<---------
                  OutStrings.Text:=s;            //<---------
                end;                             //<---------
              OutStrings.EndUpdate;
            end;
        end;
      CloseHandle(processinformation.hProcess);
    end
  else
    begin
      OutStrings.BeginUpdate;
      OutStrings.Append(SysErrorMessage(GetLastError));
      OutStrings.EndUpdate;
    end;
  CloseHandle(hPipeInputWrite);
  CloseHandle(hPipeInputRead);
  CloseHandle(hPipeOutputWrite);
  CloseHandle(hPipeOutputRead);
end;
лишнее повыбрасываешь
__________________
Некоторые программисты настолько ленивы, что сразу пишут рабочий код.

Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты.
Ответить с цитированием