-2

我需要 Pascal 程序中的 C++ 函数“System()”的功能。有没有可能使用它或类似的方法?

比如我想模仿C++函数:

System("COLOR fc");
4

3 回答 3

3

C++ 库函数system启动一个新进程。在我看来,FreePascal 函数SysUtils.ExecuteProcess会做你想做的事。

如果您真正想做的只是更改控制台上的背景颜色,您的另一种选择是调用 Windows API 函数SetConsoleTextAttribute

于 2012-12-30T01:09:52.460 回答
1

问题有点复杂。有几种方法可以解决这个问题。

  1. *nix 上,系统可以作为 unix.fpsystem() 使用。(虽然不严格 100% 与 libc 系统函数相同)

  2. Windows上,FPC 是原生的,不能通过 POSIX 或 C 库层工作。因此,Windows 上没有 system() 仿真。

  3. sysutils.Executeprocess 抽象了 Windows“createprocess(ex)”和nix Exec () 函数。这不是用于 shell 扩展,并且需要执行二进制文件的完整路径(例如,通过使用 fsearch 或等效的 Delphi 函数)

  4. Process.TProcess 是另一个涉及更多此类抽象的抽象,可以访问更多功能(如管道)。2.6.2 中流程单元的新功能是 Runcommand 函数,它们是常见情况的简单 tprocess 包装器。

  5. 此外,问题是在 Windows 上有很多不同的方法可以做这样的事情,那么选择什么?

    1. 旧的和跨 Windows 版本的移植方式:搜索 command.com 并使用 /C 执行
    2. old/console 风格,NT 方式,使用 COMSPEC 用 /C 启动 cmd.exe
    3. GUI方式,使用shellexecute()。主要用于启动与扩展相关的浏览器和其他应用程序。
    4. 创建自己的,搜索 PATH,展开环境变量,自己解析 cmdline,然后调用基本的 createprocess() 例程。

一般来说,我会使用 shellexecute ,除非它真的是命令行的东西(比如这个特定的情况),然后我会使用方法 5.2。

稍后添加,经过验证的执行过程代码(方法 5.2)

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

请注意,我将命令 (color fd) 作为一个参数传递,尽管 afaik 在 *nix 情况下更为重要。

于 2012-12-30T21:15:10.213 回答
0

system()调用特定于平台的命令行处理器。例如,在 Windows 上,system("command")调用CreateProcess()invoke %COMSPEC% /C "command",其中%COMSPEC%command.comcmd.exe取决于 Windows 版本。

于 2012-12-30T17:32:01.720 回答