gpt4 book ai didi

delphi - 为什么 CMD/Cygwin shell 在 WinExec 之后不返回?

转载 作者:行者123 更新时间:2023-12-01 19:19:33 24 4
gpt4 key购买 nike

相关的 Delphi 控制台应用程序尝试利用 WinExec 调用 Cygwinecho.exe 来输出颜色。 Cygwin 安装在 C:\cygwin 下。它的echo.exeC:\cygwin\bin\echo.exe

选择 WinExec 而不是 ShellExecute 的原因是 ShellExecute 将实例化一个新 shell 并回显该新 shell 中的文本。

当我在 Windows 的 CMD shell 中调用控制台应用程序时,会发生相同的行为。

第一次尝试

picture of the first attempt

如图所示,shell没有返回提示符。我认为 WinExec 未完成或需要另一辆车。

program TestConsole;

{$APPTYPE CONSOLE}

uses
SysUtils, Windows;

begin
WinExec('C:\cygwin\bin\echo.exe -e "\e[1;34mColored text.\e[0m"', SW_NORMAL);
end.

第二次尝试

picture of the second attempt

如图所示,很明显WinExec已经完成了。但shell仍然没有返回到提示符。我很困惑其中的原因。可以帮忙评论一下吗?任何评论将不胜感激!

program TestConsole;

{$APPTYPE CONSOLE}

uses
SysUtils, Windows;

var
I: Integer;
begin
I := WinExec('C:\cygwin\bin\echo.exe -e "\e[1;34mColored text.\e[0m"', SW_NORMAL);
Writeln(IntToStr(I));
end.

最佳答案

事实上,在打印彩色文本之前,shell 已经已经返回到提示符。您可以通过 shell 打印提示这一事实知道这一点。如果它仍在等待您的程序完成运行,它就不会这样做。通过在提示符处输入更多命令并观察 shell 为您运行它们来向自己证明这一点。

当您调用WinExec时,您异步运行该程序。该函数在将控制权返回给您的程序之前不会等待 echo 命令完成,您的程序也不会等待该命令完成。由于 shell 只等待您的程序,而不是您的程序可能已启动的任何其他程序,因此一旦您的程序终止,shell 就会打印其提示符,这显然在 echo 命令设法打印任何输出之前发生。

要解决此问题,您需要等待 echo 命令终止,然后才能允许自己的程序终止。不过,WinExec 并不要求您这样做。这也没什么问题,因为它已经被弃用了大约 17 年。相反,请使用 CreateProcess。它将返回一个进程句柄,您可以将该进程句柄传递给 WaitForSingleObject,它将阻塞直到进程终止。

关于delphi - 为什么 CMD/Cygwin shell 在 WinExec 之后不返回?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9881803/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com