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

Работа с `CreateProcess()`: запуск команд в Windows из Delphi

Delphi , Синтаксис , Справочник по API-функциям

Работа с CreateProcess(): запуск команд в Windows из Delphi

Вопрос пользователя заключается в том, чтобы выполнить через функцию CreateProcess() следующие действия:

  1. Переход в рабочую копию SVN.
  2. Выполнение команд SVN.
  3. Перенаправление вывода в файл.

В начале пользователь пытался использовать следующий код, но это не приводило к желаемому результату:

procedure TQPortMainForm.CmdMigrationClick(Sender: TObject);
var
  StartInfo: TStartupInfo;
  ProcInfo: TProcessInformation;
  CreateOk: boolean;
  input: String;
begin
  // Инициализация StartInfo и ProcInfo
  // ...
  // Формирование строки с командами
  input := 'D: & cd D:\Qport\trunk\Qport\ & ' + SVN_PATH + ' log > C:\users\PhilippKober\UNIQUE_NAME_BLUB.txt';
  // Вызов CreateProcess
  CreateOk := CreateProcess(nil, PChar(input), nil, nil, false, CREATE_NEW_PROCESS_GROUP + NORMAL_PRIORITY_CLASS, nil, nil, StartInfo, ProcInfo);
  // Ожидание завершения процесса
  if CreateOk then
    WaitForSingleObject(ProcInfo.hProcess, INFINITE);
end;

Проблема заключалась в неправильном формировании строки input. В редакте 2 пользователь предоставил исправленный код, где используется cmd.exe для выполнения команд:

StartInfo := nil;
ProcInfo := nil;
CreateOk := false;
input := nil;
path := 'D:\Qport\trunk\Qport\';
cmd := 'C:\Windows\System32\cmd.exe';
input := '/C' + SVN_PATH + ' help > C:\users\PhilippKober\UNIQUE_NAME_BLUB.txt';
CreateOk := CreateProcess(PChar(cmd), PChar(input), nil, nil, false, CREATE_NEW_PROCESS_GROUP + NORMAL_PRIORITY_CLASS, nil, PChar(path), StartInfo, ProcInfo);
if CreateOk then
  WaitForSingleObject(ProcInfo.hProcess, INFINITE);

Однако, в подтвержденном ответе отмечается, что для корректной работы необходимо изменить параметры вызова CreateProcess. В частности, следует передать путь к исполняемому файлу (в данном случае cmd.exe), использовать параметр lpCurrentDirectory для смены рабочей директории до запуска cmd.exe, и добавить параметр /C для выполнения команды и закрытия cmd.exe после её выполнения.

Исправленный код будет выглядеть следующим образом:

input := GetEnvironmentVariable('COMSPEC') + ' /C ' + SVN_PATH +
  ' log > C:\users\PhilippKober\UNIQUE_NAME_BLUB.txt';
CreateProcess(nil, PChar(input), nil, nil, False, CREATE_NEW_PROCESS_GROUP or NORMAL_PRIORITY_CLASS, nil, 'D:\Qport\trunk\Qport\', StartInfo, ProcInfo);

Также важно не забыть закрыть дескрипторы процессов и потоков, возвращаемые CreateProcess, чтобы избежать утечек ресурсов:

CloseHandle(ProcInfo.hProcess);
CloseHandle(ProcInfo.hThread);

Альтернативный ответ подтверждает необходимость передачи всех параметров в строку lpCommandLine, что является лучшей практикой при использовании CreateProcess() для запуска команд.

Создано по материалам из источника по ссылке.

Вопрос связан с использованием функции `CreateProcess()` в среде Delphi для запуска команд в командной строке Windows с целью выполнения операций с SVN репозиторием и перенаправления вывода в файл.


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

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




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


:: Главная :: Справочник по API-функциям ::


реклама


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

Время компиляции файла: 2024-12-22 20:14:06
2025-01-13 19:22:56/0.0034799575805664/0