我有一个MFC应用程序,它生成一些报告并在GUI中显示相同的内容。 当使用某些命令行参数传递时,我需要将其作为控制台应用程序运行。 在控制台模式下,它将生成标准输出/错误中的报告/错误,我应该能够将其重定向到任何文件。
对于Ex。
C:/temp MyApp.exe --console > report.txt
应该在控制台模式下运行我的exe并将所有输出重定向到文本文件。
但是如果我在没有任何控制台参数的情况下运行它,它应该像默认的MFC应用程序。
为了达到我的要求,到目前为止我已经完成了,将Linker > System > Subsytem
从Windows
更改为Console
并添加了WinMainCRTStartup
Linker > Advanced > Entry Point
现在,当我使用控制台/批处理文件中的--console
参数运行它时,我的应用程序正常工作。
但是当我直接运行它时,它仍会打开一个cmd窗口(当然因为它现在是一个控制台应用程序)。但是,我使用FreeConsole()
方法来摆脱它,但它仍然会闪烁一小段时间。
所以我很好奇是否有办法完全摆脱它,或者通过在运行时决定应用程序的子系统或任何其他技巧? 任何建议将不胜感激。
答案 0 :(得分:7)
我建议您使用Windows子系统保留GUI应用程序。
最初,在解析命令行时,您可以create a console或附加AttachConsole()
作为概念证明,在这里它看起来如何(例如在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。