c++ - 在运行时决定一个应用程序属于控制台/windows 子系统

标签 c++ windows visual-studio-2010 visual-c++ mfc

我有一个生成一些报告并在 GUI 中显示相同内容的 MFC 应用程序。 当使用某些命令行参数传递时,我需要将它作为控制台应用程序运行。 在控制台模式下,它将在标准输出/错误中生成报告/错误,我应该能够将其重定向到任何文件。

例如。 C:/temp MyApp.exe --console > report.txt 应该在控制台模式下运行我的 exe,并将所有输出重定向到一个文本文件。 但是,如果我在没有任何控制台参数的情况下运行它,它应该就像一个默认的 MFC 应用程序。

为了实现我的要求,到目前为止我所做的是,将 Linker > System > SubsytemWindows 更改为 Console 并添加 WinMainCRTStartup链接器 > 高级 > 入口点

现在,当我使用控制台/批处理文件中的 --console 参数运行我的应用程序时,它可以正常运行。 但是当我直接运行它时,它仍然会打开一个cmd窗口(当然因为它现在是一个控制台应用程序)。但是,我正在使用 FreeConsole() 方法来摆脱它,但它仍然会闪烁一秒钟。

所以我很好奇是否有办法完全摆脱它,通过在运行时决定应用程序的子系统或任何其他技巧? 任何建议将不胜感激。

最佳答案

我建议让您的 GUI 应用程序与 Windows 子系统一起使用。

一开始,在解析命令行时,您可以 create a console 而不是创建 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 question地址例如 cout 的重定向。

关于c++ - 在运行时决定一个应用程序属于控制台/windows 子系统,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30422802/

相关文章:

c++ - 将规则生成绑定(bind)到我的结构成员时出现编译错误

c++ - 如何将单个应用程序的特定线程卸载到特定的 Xeon Phi 内核?

c - 使用 TRE 进行模糊正则表达式匹配

python - 在 For 循环中从 Windows 批处理文件中的数组访问项目

c++ - 创建进程 : redirect child stdout to parent stdout in C++/Windows

.net - 我找不到 System.speech

c++ - 在 erase() 之后保持一个有效的 vector::iterator

c++ - 基于 boolean C++ 确定值的最快方法

sql-server-2008 - Visual Studio 2010 与 SQL Server 2008 和 Office 2007 的正确安装顺序?

asp.net-mvc - Windows XP上的Visual Studio 2010突然崩溃,然后停止工作,直到重新安装