2015-05-24 24 views
1

我有一個MFC應用程序,它生成一些報告並在GUI中顯示相同的內容。 我有一個需要運行它作爲控制檯應用程序,當通過某些命令行參數傳遞。 在控制檯模式下,它會在標準輸出/錯誤中生成報告/錯誤,我應該能夠將其重定向到任何文件。在運行時決定應用程序是控制檯/ windows子系統

For Ex。 C:/temp MyApp.exe --console > report.txt應該在控制檯模式下運行我的exe文件並將所有輸出重定向到一個文本文件。 但是,如果我運行它沒有任何控制檯參數,它應該像一個默認的MFC應用程序。

爲了達到我的要求,到目前爲止,我所做的是,從Windows改變了Linker > System > SubsytemConsoleLinker > Advanced > Entry Point

所以現在添加WinMainCRTStartup我的應用程序工作正常,當我從控制檯/批--console參數運行文件。 但是,當我直接運行它,它仍然打開一個cmd窗口(當然,因爲它現在是一個控制檯應用程序)。但是,我使用FreeConsole()方法來擺脫它,但它仍然閃爍一會兒。

所以我只是好奇,如果有一種方法來完全擺脫它,要麼通過在運行時決定應用程序的subsytem或任何其他技巧? 任何建議將不勝感激。

+2

[我如何編寫可作爲控制檯或GUI應用程序運行的程序?](http://blogs.msdn.com/b/oldnewthing/archive/2009/01/01/9259142.aspx ) –

+0

您可能想要考慮一個不會創建窗口的GUI程序。你可以將它作爲'C:\ temp \ MyApp.exe --outputfile report.txt'運行,因爲'>'shell重定向將不被支持。 – MSalters

+0

@MSalters:通過命令處理器啓動應用程序時,無論應用程序的子系統如何,I/O流重定向都能正常工作。 – IInspectable

回答

6

我會建議讓你的GUI應用程序與Windows子系統。

開始的時候,解析命令行的時候,而不是創建GUI窗口(MFC inistialisation),你可以create a consoleAttachConsole()

連接作爲一個概念證明,這裏怎麼可能看起來像(用於例如,在CxxxApp::InitInstance()):

... // init code but before the the CMainFrame is created 

if(...) { // suppose you want to go to the console 
    if (! AttachConsole(ATTACH_PARENT_PROCESS)) // try to hijack existing console of command line 
     AllocConsole();       // or create your own. 

    DWORD nw,nr; // demo with windows native console i/o 
    char buff[32]; 
    WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), L"Who are you ? ", 14, &nw, NULL); 
    ReadConsoleA(GetStdHandle(STD_INPUT_HANDLE), buff, sizeof(buff), &nr, NULL); 
    WriteConsoleA(GetStdHandle(STD_OUTPUT_HANDLE), "Hello ", 6, &nw, NULL); 
    WriteConsoleA(GetStdHandle(STD_OUTPUT_HANDLE), buff, nr, &nw, NULL); 
    ReadConsoleA(GetStdHandle(STD_INPUT_HANDLE), buff, 1, &nr, NULL); 
    ... 
} 

如果你想用C++ cin/cout,更多的工作需要。然而。這個其他SO question地址例如cout的重定向。

+0

由於它總是會創建一個新的控制檯,並且永遠不會附加到父級控制檯,所以我很確定從cmd.exe重定向到文件將無法使用此方法。回想一下,動機是能夠從命令行運行'MyApp.exe --console> report.txt'。 –

+0

@Christophe我實際上已經嘗試過使用'AllocConsole'和'AttachConsole'方法,但是它無法將輸出重定向到文本文件,並且控制檯也不會等待應用程序完成,並返回不需要的內容。 – foobar

+0

@IgorTandetnik它首先嚐試附加父母的。事實上,如果您從命令行啓動此代碼,它將保留在現有的命令行上。只有當你從另一個GUI(f.ex,IDE)啓動這個應用程序時,它才創建它自己的控制檯。我剛剛測試過:'cout'輸出適合重定向的文件(即使沒有在控制檯上看到結果)。 – Christophe

相關問題