【问题标题】:How can I run a console application within my Delphi console application?如何在我的 Delphi 控制台应用程序中运行控制台应用程序?
【发布时间】:2019-01-30 06:53:57
【问题描述】:

我希望我的控制台应用程序启动另一个控制台应用程序,显示另一个应用程序想要显示的所有内容,然后在另一个应用程序完成并退出后执行某些操作。 基本上:

Writeln('Started');
ShellExecute(0, 'open', 'another.exe', nil, nil, SW_SHOWNORMAL);
Writeln('Finished');

那么如何在我的控制台应用程序中显示来自另一个控制台应用程序的所有输出? 我不想从另一个应用程序捕获输出。我只想在同一个命令行窗口中执行另一个应用程序。

【问题讨论】:

  • 我希望你能找到一些关于控制台输出读取的信息,以便等待它的退出。
  • @Victoria 我不能将处理重定向到另一个 exe 吗?就像我在批处理/bash 脚本中那样?
  • @Graymatter 这不是重复的。您的链接指向另一个问题。
  • David Heffernan 接受的答案正是您所需要的。它启动一个 ping,等待它完成,然后写出 ping 的结果。

标签: delphi


【解决方案1】:

你可能想尝试这样的事情:

program Project1;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  Windows, SysUtils;

var
  cl: string;
  SI: TStartupInfo;
  PI: TProcessInformation;

begin

  cl := 'C:\WINDOWS\System32\ping.exe 127.0.0.1';
  UniqueString(cl);

  try
    try
      writeln('begin');
      FillChar(SI, sizeof(SI), 0);
      FillChar(PI, sizeof(PI), 0);
      SI.cb := sizeof(SI);

      if not CreateProcess(nil, PChar(cl), nil, nil, true, 0, nil, nil, SI, PI) then
        RaiseLastOSError;

      WaitForSingleObject(PI.hProcess, INFINITE);

      CloseHandle(PI.hProcess);
      CloseHandle(PI.hThread);

      writeln('end');
    except
      on E: Exception do
        Writeln(E.ClassName, ': ', E.Message);
    end;
  finally
    Writeln('Complete');
    Readln;
  end;


end.

【讨论】:

  • 谢谢。就是这样——运行一个应用程序,让它获取标准输出和标准输入,等待它并退出。
  • 泄漏两个句柄并将不可修改的字符串传递给第二个参数。那是 Unicode Delphi 上的 AV。
  • @David:非常感谢您的意见。手柄泄漏非常尴尬;在发布关于我非常生疏的主题的 A 之前,我应该更仔细地阅读文档(在这一点上非常清楚)。关于第二个参数,我知道它必须是可写的,这就是为什么我没有使用字符串常量。但也许我的方法还不够。也许我确实需要UniqueString 之类的东西? (代码在我尝试过的任何 Unicode D. 版本上都没有 AV,但我相信你。当然,“它在我的机器上工作”并不能证明代码的正确性。)
  • @DavidHeffernan:我知道我不需要 try..finally 只是为了 WaitForSingleObject,但我选择添加它,因为未来的开发人员可能会在检索句柄和对CloseHandletry..finally 块的调用是免费的。我会添加UniqueString。谢谢!
  • 从实际考虑中将它们包括在内,就像您最初所做的那样,可能会告诉读者 WFSO 可以引发异常。它不能。所以我认为从教学角度来说,最好不要冒险提出这个建议。
猜你喜欢
  • 1970-01-01
  • 2011-01-22
  • 2013-02-11
  • 2010-11-04
  • 1970-01-01
  • 2011-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多