Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

CreateProcess, который возвращает консольный вывод

Delphi , ОС и Железо , DOS и Консоль

CreateProcess, который возвращает консольный вывод

- Можно ли научить слона работать в Windows?
- Нет, он ведь боится мышей.


procedure ExecConsoleApp(CommandLine: AnsiString; Output: TStringList; Errors:
  TStringList);
var
  sa: TSECURITYATTRIBUTES;
  si: TSTARTUPINFO;
  pi: TPROCESSINFORMATION;
  hPipeOutputRead: THANDLE;
  hPipeOutputWrite: THANDLE;
  hPipeErrorsRead: THANDLE;
  hPipeErrorsWrite: THANDLE;
  Res, bTest: Boolean;
  env: array[0..100] of Char;
  szBuffer: array[0..256] of Char;
  dwNumberOfBytesRead: DWORD;
  Stream: TMemoryStream;
begin
  sa.nLength := sizeof(sa);
  sa.bInheritHandle := true;
  sa.lpSecurityDescriptor := nil;
  CreatePipe(hPipeOutputRead, hPipeOutputWrite, @sa, 0);
  CreatePipe(hPipeErrorsRead, hPipeErrorsWrite, @sa, 0);
  ZeroMemory(@env, SizeOf(env));
  ZeroMemory(@si, SizeOf(si));
  ZeroMemory(@pi, SizeOf(pi));
  si.cb := SizeOf(si);
  si.dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;
  si.wShowWindow := SW_HIDE;
  si.hStdInput := 0;
  si.hStdOutput := hPipeOutputWrite;
  si.hStdError := hPipeErrorsWrite;

  (* Remember that if you want to execute an app with no parameters you nil the
     second parameter and use the first, you can also leave it as is with no
     problems.                                                                 *)
  Res := CreateProcess(nil, pchar(CommandLine), nil, nil, true,
    CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, @env, nil, si, pi);

  // Procedure will exit if CreateProcess fail
  if not Res then
  begin
    CloseHandle(hPipeOutputRead);
    CloseHandle(hPipeOutputWrite);
    CloseHandle(hPipeErrorsRead);
    CloseHandle(hPipeErrorsWrite);
    Exit;
  end;
  CloseHandle(hPipeOutputWrite);
  CloseHandle(hPipeErrorsWrite);

  //Read output pipe
  Stream := TMemoryStream.Create;
  try
    while true do
    begin
      bTest := ReadFile(hPipeOutputRead, szBuffer, 256, dwNumberOfBytesRead,
        nil);
      if not bTest then
      begin
        break;
      end;
      Stream.Write(szBuffer, dwNumberOfBytesRead);
    end;
    Stream.Position := 0;
    Output.LoadFromStream(Stream);
  finally
    Stream.Free;
  end;

  //Read error pipe
  Stream := TMemoryStream.Create;
  try
    while true do
    begin
      bTest := ReadFile(hPipeErrorsRead, szBuffer, 256, dwNumberOfBytesRead,
        nil);
      if not bTest then
      begin
        break;
      end;
      Stream.Write(szBuffer, dwNumberOfBytesRead);
    end;
    Stream.Position := 0;
    Errors.LoadFromStream(Stream);
  finally
    Stream.Free;
  end;

  WaitForSingleObject(pi.hProcess, INFINITE);
  CloseHandle(pi.hProcess);
  CloseHandle(hPipeOutputRead);
  CloseHandle(hPipeErrorsRead);
end;

(* got it from yahoo groups, so no copyrights for this piece :p and and example
   of how to use it. put a button and a memo to a form.                      *)

procedure TForm1.Button1Click(Sender: TObject);
var
  OutP: TStringList;
  ErrorP: TStringList;
begin
  OutP := TStringList.Create;
  ErrorP := TstringList.Create;

  ExecConsoleApp('ping localhost', OutP, ErrorP);
  Memo1.Lines.Assign(OutP);

  OutP.Free;
  ErrorP.Free;
end;

Привет! Я переведу текст на русский язык:

Это код-snippet на Delphi, который создает консольное приложение с помощью функции CreateProcess и захватывает его потоки вывода и ошибок.

Вот шаг за шагом, что код делает:

  1. Он определяет два списка строк, Output и Errors, для хранения сообщений о выводе и ошибках из консольного приложения.
  2. Он настраивает некоторые переменные для создания консольного процесса:
    • sa: структура безопасности
    • si: структура запуска
    • pi: структура информации о процессе
    • hPipeOutputRead и hPipeOutputWrite: handles для чтения и записи в поток вывода
    • hPipeErrorsRead и hPipeErrorsWrite: handles для чтения и записи в поток ошибок
  3. Он создает два трубопровода с помощью функции CreatePipe, один для потока вывода и другой для потока ошибок.
  4. Он настраивает некоторые переменные окружения и структуру запуска:
    • si.cb: устанавливает размер структуры запуска
    • si.dwFlags: устанавливает флаги для структуры запуска (в этом случае, используя стандартные handles)
    • si.wShowWindow: устанавливает состояние отображения окна в скрытом режиме
    • si.hStdInput, si.hStdOutput и si.hStdError: устанавливают стандартные handles для ввода, вывода и ошибок
  5. Он вызывает функцию CreateProcess с следующими аргументами:
    • nil как handle родительского процесса (т.е., текущего процесса)
    • pchar(CommandLine) как командная строка для выполнения
    • nil как блок окружения
    • true как флаг, указывающий, что процесс должен наследовать handles
    • CREATE_NEW_CONSOLE и NORMAL_PRIORITY_CLASS как флаги для создания нового консольного процесса с нормальной приоритетом
  6. Он проверяет, была ли успешна создание процесса, и если нет, то закрывает все handles и выходит.
  7. Если создание было успешно, он читает из потока вывода с помощью функции ReadFile, хранящие данные в памятном потоке (Stream). Затем он загружает этот поток в список строк Output.
  8. Он повторяет шаг 7 для потока ошибок, загружая его содержимое в список строк Errors.
  9. Наконец, он ожидает завершения процесса с помощью функции WaitForSingleObject и затем закрывает все handles.

Пример кода формы (TForm1.Button1Click) демонстрирует, как использовать процедуру ExecConsoleApp:

  • Он создает два списка строк, OutP и ErrorP
  • Он вызывает ExecConsoleApp с командной строкой 'ping localhost'
  • Он присваивает вывод из консольного приложения мему-контролю (Memo1) с помощью метода Assign.

В целом, этот код предоставляет способ выполнить консольное приложение с помощью функции CreateProcess Delphi и захватить его потоки вывода и ошибок.

Создается приложение на Delphi, которое запускает консольное приложение и возвращает его вывод и ошибки в виде списка строк.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: DOS и Консоль ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-07-15 21:44:50/0.0062370300292969/0