如何创建一个可以在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()。你会得到你自己的控制台。
*首先调用'AttachConsole(ATTACH_PARENT_PROCESS)',如果失败则调用'AllocConsole'。只有在必要时(例如,从Explorer.EXE调用时),您才能获得自己的控制台。 – MSalters
不,这忽略了OP正试图解决的问题,两个程序试图同时从控制台读取。 –
freopen(“CON”,“w”,stdout); freopen(“CON”,“r”,stdin); 最好的作品 – user1754508