Системная () функция в Паскале?

Мне нужна функциональность C++ функции "System()" в моей программе на Паскале. Есть ли какой-нибудь возможный способ использовать его или что-то подобное?

Например, я хочу имитировать функцию C++:

System("COLOR fc");

3 ответа

Функция библиотеки C++ system начинает новый процесс. Это выглядит как функция FreePascal SysUtils.ExecuteProcess будет делать то, что вы хотите.

Другой вариант, если все, что вам действительно нужно, это изменить цвет фона на консоли, это вызвать функцию API-интерфейса Windows SetConsoleTextAttribute.

Проблема немного сложная. Есть несколько способов подойти к этому.

  1. В *nix система доступна как unix.fpsystem(). (хотя не совсем на 100% совпадает с системной функцией libc)

  2. В Windows FPC является родным и не работает через библиотечный слой POSIX или C. Поэтому в Windows нет эмуляции system ().

  3. sysutils.Executeprocess абстрагирует функции "createprocess(ex)" и nix Exec() от Windows. Это не для расширения оболочки и требует полного пути к исполняемому файлу (например, с помощью fsearch или эквивалентной функции Delphi)

  4. Process.TProcess - еще одна, более сложная такая абстракция, обеспечивающая доступ к большему количеству функций (например, к трубопроводам) Новым в модуле процесса в 2.6.2 являются функции Runcommand, которые являются простыми обертками tprocess для общих случаев.

  5. Кроме того, проблема в том, что существует много разных способов сделать что-то подобное в Windows, так что же выбрать?

    1. Портативная версия старой и кросс-Windows-версии: найдите command.com и выполните с /C
    2. старый / консольный стиль, путь NT, используйте COMSPEC для запуска cmd.exe с /C
    3. Путь GUI, используйте shellexecute(). В основном используется для запуска браузеров и других приложений, связанных с расширениями.
    4. Создайте свой собственный, найдите PATH, разверните переменные окружения, проанализируйте cmdline самостоятельно, а затем вызовите основные процедуры createprocess().

В общем, я бы использовал shellexecute, если это не командная строка (как в данном конкретном случае), тогда я бы использовал метод 5.2.

Позже добавлен проверенный код для executeprocess (метод 5.2)

uses 
 Sysutils;
begin
  ExecuteProcess(getenvironmentvariable('COMSPEC'), ['/C','COLOR fd']);
end.

Обратите внимание, что я передаю команду (color fd) как один параметр, хотя afaik это более важно в случае *nix.

system() вызывает специфичный для платформы процессор командной строки. В Windows, например, system("command") звонки CreateProcess() вызывать %COMSPEC% /C "command", где %COMSPEC% либо command.com или же cmd.exe в зависимости от версии Windows.

Другие вопросы по тегам