有问题的Delphi控制台应用程序尝试利用WinExec
来调用Cygwin
echo.exe
以输出颜色。 Cygwin
安装在C:\cygwin
下。其echo.exe
为C:\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。
如图所示,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.
如图所示,很明显WinExec已经完成了。但是shell仍然没有返回提示符。我很困惑这个原因。你能帮忙发表评论吗?任何评论将不胜感激!!
{{1}}
答案 0 :(得分:4)
事实上,在彩色文本打印之前,shell已经已经返回到提示符。你知道shell 打印一个提示符。如果它还在等待你的程序完成运行,它就不会这样做。通过在提示符下键入更多命令并观察shell为您运行它们来证明自己。
当您致电WinExec
时,您将异步运行程序。该函数在将控制权返回给程序之前不会等待echo
命令完成,并且程序也不会等待命令完成。由于shell只等待你的程序,而不是你的程序可能已启动的任何其他程序,所以一旦你的程序终止,shell就会打印出它的提示,这显然是在echo
命令设法打印任何输出之前发生。
要解决此问题,您需要在允许自己的程序终止之前等待echo
命令终止。但是WinExec
并不是所有人都这样做的。这也是因为它已被弃用了大约17年。相反,请使用CreateProcess
。它将返回一个进程句柄,您可以将该进程句柄传递给WaitForSingleObject
,它将一直阻塞,直到进程终止。