2010-08-26 62 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

相關問題