【问题标题】:Implementing Input/Output redirection in a Delphi console application在 Delphi 控制台应用程序中实现输入/输出重定向
【发布时间】:2011-04-04 11:39:30
【问题描述】:

我有一个 Delphi 7(不是 2007)应用程序(我们称之为 App1.exe) IDE 认为是 GUI 应用程序,但在 DPR 中是编译器 将其放入控制台应用程序的指令。示例:

{$IFDE MAKE_CONSOLE}
  {$APPTYPE CONSOLE}
{$ENDIF MAKE_CONSOLE}

在构建过程中,可能会定义 MAKE_CONSOLE。

我遇到的问题是我们有另一个控制台应用程序 (例如,App2.exe)使用 WinAPI CreateProcess 运行 App1.exe。什么时候 发生时,App1.exe 的输出无处可见:-( 当 App1.exe 直接从命令行 (cmd.exe) 运行,输出为 显示在命令行窗口中。

我猜我需要将 App1.exe 的输出重定向到 CreateProcess,使用 STARTUPINFO 结构。我不确定是什么 我注定要在这里工作。

其他信息: * 正在使用的“dwCreationFlags”是:CREATE_NEW_PROCESS_GROUP + NORMAL_PRIORITY_CLASS + DEBUG_PROCESS(是的,App2 调试 App1)

  • 'bInheritHandles' 为假(需要更改吗?)。

  • 'lpProcessAttributes' 和 'lpThreadAttributes' 都为零,同样如此 'lpEnvironment' 和 'lpCurrentDirectory'。

我是否遗漏了任何需要帮助我的信息?

任何指针都会很棒!

非常感谢。

【问题讨论】:

  • 请注意,没有“GUI 控制台”应用程序之类的东西。它是一个或另一个。由于您设置了 APPTYPE CONSOLE 设置,因此您的程序是控制台程序。 IDE 在项目选项中显示的内容无关紧要;它被代码打败了。
  • App1.exe 似乎有三种构建方法:Gui、文本输出和 XML 文件输出,我正在测试它被构建为生成 XML 文件输出(因此,没有输出到控制台) .谢谢大家的建议!

标签: delphi console redirect


【解决方案1】:

您是否有任何机会在进程创建标志中有 DETACHED_PROCESS?继承父控制台应该是默认的。

【讨论】:

  • 没有。唯一指定的标志是 CREATE_NEW_PROCESS_GROUP + NORMAL_PRIORITY_CLASS + DEBUG_PROCESS。
【解决方案2】:

这篇 MSDN 文章讨论了 App2 如何重定向 App1 的输出:

Creating a Child Process with Redirected Input and Output

【讨论】:

    【解决方案3】:

    这是我用于从 Deplhi 7 调用命令行程序的一些代码。

    如果您将“Visibility”参数设置为0,而不是“SW_SHOWNORMAL”,它可以重定向到当前控制台(主调用exe)。

    function WinExecAndWait(const FileName: String; Visibility: integer): cardinal;
    var StartupInfo: TStartupInfo;
        ProcessInfo: TProcessInformation;
        Options: cardinal;
    begin
      FillChar(StartupInfo,Sizeof(StartupInfo),0);
      StartupInfo.cb := Sizeof(StartupInfo);
      StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
      StartupInfo.wShowWindow := Visibility;
      if Visibility=0 then begin
        Flush(Output);
        Options := NORMAL_PRIORITY_CLASS;
      end else
        Options := CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS;
      if not CreateProcess(nil,
         pointer(FileName),             { pointer to command line string }
         nil,                           { pointer to process security attributes }
         nil,                           { pointer to thread security attributes }
         false,                         { handle inheritance flag }
         Options,                       { creation flags }
         nil,                           { pointer to new environment block }
         nil,                           { pointer to current directory name }
         StartupInfo,                   { pointer to STARTUPINFO }
         ProcessInfo) then              { pointer to PROCESS_INF }
        Result := cardinal(-1) else begin
        WaitforSingleObject(ProcessInfo.hProcess,INFINITE);
        GetExitCodeProcess(ProcessInfo.hProcess,Result);
      end;
    end;
    

    【讨论】:

      【解决方案4】:

      Martin Lafferty 的 ConsoleApp 非常适合重定向控制台程序的输出。你会得到一个事件处理程序,它会为每一行控制台输出调用。

      我找不到代码的官方主页,但这里是 Embarcadero 的页面:

      http://cc.embarcadero.com/Item/14692

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-03-17
        • 2010-11-05
        • 1970-01-01
        • 1970-01-01
        • 2011-05-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多