在 运行 时间决定一个应用程序属于 console/windows 子系统
Decide an application to be of console/windows subsystem at run time
我有一个 MFC 应用程序可以生成一些报告并在 GUI 中显示相同的报告。
当使用某些命令行参数传递时,我需要 运行 将其作为控制台应用程序。
在控制台模式下,它将以标准 output/error 生成 reports/errors,我应该能够将其重定向到任何文件。
例如。
C:/temp MyApp.exe --console > report.txt
应该 运行 我的 exe 处于控制台模式,并将所有输出重定向到文本文件。
但是如果我 运行 它没有任何控制台参数,它应该就像一个默认的 MFC 应用程序。
为了达到我的要求,到目前为止我所做的是,将 Linker > System > Subsytem
从 Windows
更改为 Console
并在以下位置添加 WinMainCRTStartup
Linker > Advanced > Entry Point
现在,当我使用 console/batch 文件中的 --console
参数 运行 时,我的应用程序可以正常工作。
但是当我直接运行它时,它仍然会打开一个cmd window(当然因为它现在是一个控制台应用程序)。但是,我正在使用 FreeConsole()
方法来摆脱它,但它仍然会闪烁一秒钟。
所以我很好奇是否有办法完全摆脱它,通过在 运行 时间决定应用程序的子系统或任何其他技巧?
任何建议将不胜感激。
我建议将您的 GUI 应用程序与 windows 子系统一起使用。
一开始,在解析命令行时,您可以 create a console or attach with AttachConsole()
而不是创建 GUI windows(MFC 初始化)
作为概念证明,这里是它的样子(例如 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 的重定向。
我有一个 MFC 应用程序可以生成一些报告并在 GUI 中显示相同的报告。 当使用某些命令行参数传递时,我需要 运行 将其作为控制台应用程序。 在控制台模式下,它将以标准 output/error 生成 reports/errors,我应该能够将其重定向到任何文件。
例如。
C:/temp MyApp.exe --console > report.txt
应该 运行 我的 exe 处于控制台模式,并将所有输出重定向到文本文件。
但是如果我 运行 它没有任何控制台参数,它应该就像一个默认的 MFC 应用程序。
为了达到我的要求,到目前为止我所做的是,将 Linker > System > Subsytem
从 Windows
更改为 Console
并在以下位置添加 WinMainCRTStartup
Linker > Advanced > Entry Point
现在,当我使用 console/batch 文件中的 --console
参数 运行 时,我的应用程序可以正常工作。
但是当我直接运行它时,它仍然会打开一个cmd window(当然因为它现在是一个控制台应用程序)。但是,我正在使用 FreeConsole()
方法来摆脱它,但它仍然会闪烁一秒钟。
所以我很好奇是否有办法完全摆脱它,通过在 运行 时间决定应用程序的子系统或任何其他技巧? 任何建议将不胜感激。
我建议将您的 GUI 应用程序与 windows 子系统一起使用。
一开始,在解析命令行时,您可以 create a console or attach with 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 的重定向。