簡體   English   中英

在Delphi控制台應用程序中實現輸入/輸出重定向

[英]Implementing Input/Output redirection in a Delphi console application

我有一個Delphi 7(不是2007年)應用程序(不稱其為App1.exe),IDE認為它是一個GUI應用程序,但在DPR中,它是一個編譯器指令,可將其導入控制台應用程序。 例:

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

在生成過程中,可能會定義MAKE_CONSOLE。

我遇到的問題是,我們有另一個使用WinAPI CreateProcess運行App1.exe的控制台應用程序(例如App2.exe)。 發生時,從哪里都看不到App1.exe的輸出:-(當直接從命令行(cmd.exe)運行App1.exe時,輸出將顯示在命令行窗口中。

我猜想我需要使用STARTUPINFO結構重定向CreateProcess中App1.exe的輸出。 我不確定在這里要做什么。

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

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

  • 'lpProcessAttributes'和'lpThreadAttributes'均為零,'lpEnvironment'和'lpCurrentDirectory'也是。

我是否錯過了任何需要幫助我的信息?

任何指針都很棒!

提前謝謝了。

這是我用於從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;

您是否有機會在流程創建標志中包含DETACHED_PROCESS? 繼承父控制台應該是默認設置。

此MSDN文章討論了App2如何重定向App1的輸出:

創建具有重定向輸入和輸出的子進程

Martin Lafferty的ConsoleApp可以出色地重定向控制台程序的輸出。 您將獲得一個事件處理程序,該事件處理程序將被控制台輸出的每一行調用。

我找不到該代碼的官方主頁,但這里是Embarcadero的頁面:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM