2010-08-26 109 views
1

我有一个Delphi 7(不是2007)应用程序(让我们称之为App1.exe) IDE认为是GUI应用程序,但在DPR中,编译器 指令使其进入控制台应用程序。示例:在Delphi控制台应用程序中实现输入/输出重定向

{$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'为零。

我是否错过了帮助我需要的任何信息?

任何指针都会很棒!

非常感谢提前。

+0

请注意,是作为“GUI控制台”应用程序没有这样的事。它是一个或另一个。既然你已经设置了APPTYPE CONSOLE设置,你的程序就是一个控制台程序。 IDE在项目选项中显示的内容无关紧要;它被代码欺骗了。 – 2010-08-26 21:56:21

+0

似乎App1.exe有三种构建方法:Gui,Text输出和XML文件输出,并且我正在测试构建它时生成XML文件输出(因此没有输出到控制台)。 感谢大家的建议! – 2010-09-13 20:02:27

回答

0

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

+0

否。指定的唯一标志是CREATE_NEW_PROCESS_GROUP + NORMAL_PRIORITY_CLASS + DEBUG_PROCESS。 – 2010-08-28 22:41:06

1

下面是一些代码,我用从Deplhi 7调用命令行程序

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

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; 
0

Martin Lafferty的ConsoleApp在重定向控制台程序的输出方面很漂亮。你会得到一个事件处理程序,它被称为控制台输出的每一行。

我找不到代码的官方主页,但这里的英巴卡迪诺的页面:

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

相关问题