在Delphi控制台应用程序中实现输入/输出重定向

时间:2010-08-26 19:56:15

标签: delphi console redirect

我有一个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直接从Commandline(cmd.exe)运行,输出为 显示在命令行窗口中。

我猜测的是我需要重定向App1.exe中的输出 CreateProcess,使用STARTUPINFO结构。我不确定是什么 我打算在这里做。

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

  • 'bInheritHandles'为假(这是否需要更改?)。

  • 'lpProcessAttributes'和'lpThreadAttributes'都是零,因为 'lpEnvironment'和'lpCurrentDirectory'。

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

任何指针都会很棒!

非常感谢提前。

4 个答案:

答案 0 :(得分:1)

以下是我用来从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;

答案 1 :(得分:0)

你有没有在进程创建标志中有DETACHED_PROCESS?继承父控制台应该是默认值。

答案 2 :(得分:0)

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

Creating a Child Process with Redirected Input and Output

答案 3 :(得分:0)

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

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

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