在运行时决定一个应用程序属于控制台/windows子系统
Decide an application to be of console/windows subsystem at run time
我有一个MFC应用程序,它生成一些报告并在GUI中显示相同的内容。我需要在传递某些命令行参数时将其作为控制台应用程序运行。在控制台模式下,它将在标准输出/错误中生成报告/错误,我应该能够将其重定向到任何文件。
为例。 C:/temp MyApp.exe --console > report.txt
应该在控制台模式下运行我的exe并将所有输出重定向到文本文件。但是如果我在没有任何控制台参数的情况下运行它,它应该像一个默认的MFC应用程序。
为了达到我的要求,到目前为止我所做的是,将Linker > System > Subsytem
从Windows
改为Console
,并添加WinMainCRTStartup
atLinker > Advanced > Entry Point
所以现在我的应用程序工作正常,当我运行它与--console
参数从控制台/批处理文件。但是当我直接运行它时,它仍然打开一个cmd窗口(当然,因为它现在是一个控制台应用程序)。然而,我使用FreeConsole()
方法来摆脱它,但它仍然闪烁了一秒钟。
所以我很好奇是否有一种方法可以完全摆脱它,要么通过在运行时决定应用程序的子系统,要么通过任何其他技巧?
我建议将您的GUI应用程序与windows子系统保持一致。
一开始,当解析命令行,而不是创建GUI窗口(MFC初始化),您可以创建一个控制台或附加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问题针对的是重定向计数。
- 试图在visual studio上用C++创建一个桌面应用程序
- FFmpeg:制作一个应用程序比直接使用ffmepg更好吗
- 在C应用程序中运行C++(带有STL)函数
- 使用VerQueryValue检索应用程序的文件描述
- Qt C++静态thread_local QNetworkAccessManager是线程应用程序的好选择吗
- 使用调试/崩溃报告将应用程序部署到客户端
- C++控制台应用程序阻止退出
- 码头化的C++应用程序是否向后兼容早期的内核版本
- 将应用程序从32位移植到64位时出现问题
- 如何改变c++应用程序的视觉效果
- WM_CTLCOLORSTATIC从未在WIN32应用程序中触发
- PC中的程序和PHONE中的本机描述应用程序之间的数据连接
- 应用程序崩溃并显示"symbol _ZdlPvm, version Qt_5 not defined in file libQt5Core.so.5 with link time reference"
- 示例外壳应用程序显示的 V8 "segmentation fault (core dumped)"错误
- phytec phyBOARD iMX-6在从闪存而不是SD卡运行qt5 opengles应用程序时表现不佳(FPS减半
- 为什么导入Mixed native/CLR lib.dll的本机C++应用程序没有在Mixed lib.dll中的外部变
- 如何从Windows应用程序输出到标准?
- C++应用程序 MySQL odbc 数据库连接错误:在引发"otl_tmpl_exception<>"实例后终止调用
- 从不属于应用程序的闪存读取
- 在运行时决定一个应用程序属于控制台/windows子系统