在运行时确定应用程序是控制台/ Windows子系统

foo*_*bar 2 c++ windows mfc visual-studio-2010 visual-c++

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

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

为了达到我的要求,到目前为止,我所做的是,改变了Linker > System > SubsytemWindowsConsole并添加WinMainCRTStartupLinker > Advanced > Entry Point

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

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

Chr*_*phe 7

我建议将你的GUI应用程序与windows子系统保持一致.

在开始时,在解析命令行时,您可以创建控制台或附加命令行,而不是创建GUI窗口(MFC inistialisation)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);
    ...
}
Run Code Online (Sandbox Code Playgroud)

如果您想使用C++ cin/ cout,则需要进行额外的工作.这个其他的SO问题解决了例如cout的重定向问题.