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

Лови модуль, буквально вчера писал. Точно знаю что работает на Delphi XE, про остальные версии 100% утверждать не берусь, но теоретически работать должно.
Код:
unit ConsoleAppRunner;

interface
uses
  Classes;
procedure RunConsoleApplication(CmdLine,Params:AnsiString;OutStrings:TStrings);

implementation
uses
  Windows,AnsiStrings;
procedure RunConsoleApplication(CmdLine,Params:AnsiString;OutStrings:TStrings);
var
  securityattributes: TSecurityAttributes;
  startupinfo: TStartupInfoA;
  processinformation: TProcessInformation;
  hPipeInputRead: THandle;
  hPipeInputWrite: THandle;
  hPipeOutputRead: THandle;
  hPipeOutputWrite: THandle;
  WaitResult:Cardinal;
  buf: array [0..1023] of AnsiChar;
  dummy: Cardinal;
begin
  OutStrings.Append(#13#10);
  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));
  startupinfo.cb:=SizeOf(TStartupInfo);
  startupinfo.dwFlags:=STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;
  startupinfo.wShowWindow:=SW_HIDE;
  startupinfo.hStdInput:=hPipeInputRead;
  startupinfo.hStdOutput:=hPipeOutputWrite;
  startupinfo.hStdError:=hPipeOutputWrite;
  OutStrings.BeginUpdate;
  OutStrings.Append(CmdLine+' '+Params);
  OutStrings.EndUpdate;
  if CreateProcessA(nil, PAnsiChar(CmdLine+' '+Params), nil, nil, True, CREATE_NEW_CONSOLE,
    nil, PAnsiChar(AnsiStrings.ExtractFileDir(CmdLine)), startupinfo, processinformation) then
    begin
      repeat
        WaitResult:=WaitForSingleObject(processinformation.hProcess, 100);
        if ReadFile(hPipeOutputRead, buf, Length(buf), dummy, nil) then
          begin
            OemToAnsiBuff(buf, buf, dummy);
            OutStrings.BeginUpdate;
            OutStrings.Text:=OutStrings.Text+Copy(buf, 1, dummy);
            OutStrings.EndUpdate;
          end;
      until WaitResult<>WAIT_TIMEOUT;
      CloseHandle(processinformation.hProcess);
    end;
  CloseHandle(hPipeInputWrite);
  CloseHandle(hPipeInputRead);
  CloseHandle(hPipeOutputWrite);
  CloseHandle(hPipeOutputRead);
end;
end.
Параметры:
CmdLine - exe-файл (указываем полный путь, далее этот путь будет использоваться как рабочий каталог)
Params - параметры
OutStrings - объект для вывода результатов (в самом простом варианте это Memo1.Lines)
__________________
Некоторые программисты настолько ленивы, что сразу пишут рабочий код.

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