为什么在WinExec之后CMD / Cygwin shell没有返回?

时间:2012-03-27 00:32:58

标签: delphi shell console cygwin windows-shell

有问题的Delphi控制台应用程序尝试利用WinExec来调用Cygwin echo.exe以输出颜色。 Cygwin安装在C:\cygwin下。其echo.exeC:\cygwin\bin\echo.exe

选择WinExec超过ShellExecute ShellExecute的原因是program TestConsole; {$APPTYPE CONSOLE} uses SysUtils, Windows; begin WinExec('C:\cygwin\bin\echo.exe -e "\e[1;34mColored text.\e[0m"', SW_NORMAL); end. 将实例化一个新shell并回显该新shell中的文本。

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

首次尝试

picture of the first attempt

如图所示,shell不会返回提示符。我虽然WinExec没有完成或需要另一辆车。

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.

第二次尝试

picture of the second attempt

如图所示,很明显WinExec已经完成了。但是shell仍然没有返回提示符。我很困惑这个原因。你能帮忙发表评论吗?任何评论将不胜感激!!

{{1}}

1 个答案:

答案 0 :(得分:4)

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

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

要解决此问题,您需要在允许自己的程序终止之前等待echo命令终止。但是WinExec并不是所有人都这样做的。这也是因为它已被弃用了大约17年。相反,请使用CreateProcess。它将返回一个进程句柄,您可以将该进程句柄传递给WaitForSingleObject,它将一直阻塞,直到进程终止。