如何创建一个可以在GUI对话模式下或通过命令行启动的C++ MFC程序?

问题描述:

我有一个可以工作的C++ MFC程序,但我也希望能够通过命令行调用更简单的版本。 (如果有cmd行参数,这可以使用cmd行版本。)我希望程序使用当前打开的“cmd”窗口,并在某种程度上为它创建一个新的shell。在InitInstance()中,我有...如何创建一个可以在GUI对话模式下或通过命令行启动的C++ MFC程序?

CString cmdLine; 
cmdLine.Format("%s", this->m_lpCmdLine); 
if(cmdLine.IsEmpty()) 
    dlg.DoModal(); // Run application normally 
else 
{ 
    CString header = "Welcome to the program!"; 
    AttachConsole(ATTACH_PARENT_PROCESS);  // Use current console window 
    LPDWORD charsWritten = 0; 
    WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), header, header.GetLength(), NULL, NULL); 
} 

如何获取输入到我的程序中? cin似乎不工作。我试过这样的:

char input[10] = ""; 
while((strcmp(input, "q") != 0) && (strcmp(input, "quit") != 0)) 
    scanf("%s", input); 

但它似乎不工作,因为命令窗口等待新的提示。

最根本的问题是您的MFC程序没有在其EXE头文件中标记为控制台模式程序。所以命令处理器没有理由等待它完成,就像它通常为控制台模式程序所做的那样。你现在有两个程序试图从控制台读取你和cmd.exe。你输了。

有几种解决方法,都没有吸引力:

  • start /wait yourapp.exe arg1 arg2...
  • 更改启动程序的链接器+系统+子系统设置控制台。当你发现你没有任何参数时调用FreeConsole。闪存有点令人讨厌,对于Java程序员而言是众所周知的
  • 当你发现你有参数时调用AllocConsole()。你会得到你自己的控制台。
+0

*首先调用'AttachConsole(ATTACH_PARENT_PROCESS)',如果失败则调用'AllocConsole'。只有在必要时(例如,从Explorer.EXE调用时),您才能获得自己的控制台。 – MSalters

+0

不,这忽略了OP正试图解决的问题,两个程序试图同时从控制台读取。 –

+0

freopen(“CON”,“w”,stdout); freopen(“CON”,“r”,stdin); 最好的作品 – user1754508