,并在使用CIN的情况下,这不是一个可行的解决方案无论如何
这是你的问题的杀手细节。这很简单,首先调用AttachConsole(ATTACH_PARENT_PROCESS)来尝试附加到现有的控制台。当您的程序从资源管理器或桌面快捷方式等GUI程序启动时,这会失败。所以如果它返回FALSE,那么调用AllocConsole()来创建你自己的控制台。
使用cin是一个问题。命令处理器会关注您的EXE并检查它是否为控制台模式应用程序或GUI应用程序。它会检测到您的案例中的GUI应用程序,然后不会等待该过程完成。它再次显示提示并等待输入。然后你也会等待输入,但是你会失败,命令处理器首先到达那里。您的输出也与命令提示符混合在一起,这是要解决的简单问题。
有一个简单的解决方法,你的用户应该用start /wait yourapp
开始你的程序,告诉命令处理器等待该过程完成。问题是:没有人使用过。用户不会意识到键入输入时会发生什么情况,而是希望它进入您的程序,但它实际上是由命令处理器解释的。产生一个神秘的错误信息或格式化硬盘驱动器。
只有两个很好的方法来解决这个无法解决的问题。您可以将您的程序构建为控制台模式应用程序,并在您确定要显示GUI时调用FreeConsole()。或者总是调用AllocConsole()。这些不是很好的选择。第一种方法是Windows上的Java JVM使用的方法。其中一个针对JVM提出的最老的错误,使Java程序员完全从闪烁的控制台窗口中跳出来。
第三个选择是唯一的体面的一个,你不想要的,创建另一个总是使用控制台的EXE。像Java一样,javaw.exe vs java.exe。
一个诡计是可能的,您可以将该文件从“yourapp2.exe”重命名为“yourapp.com”。当用户在命令行提示符下键入“yourapp”时,它将被首先选中,桌面快捷方式仍然可以指向“yourapp.exe”。 Visual Studio使用这个技巧,devenv.com vs devenv.exe。
可能重复://计算器.com/questions/447352 /如何知道我们是在一个控制台还是一个窗口的应用程序) – wallyk 2013-04-11 15:35:47
如果您的应用程序正在运行,您是否只想打印到控制台?一?你可以使用'cout',如果程序没有从控制台启动,它将被忽略。 – 2013-04-11 15:36:53
@ slavik262我不会在Windows上花太多时间,但是从以前的经验来看,如果它不是控制台应用程序,则打印到控制台时会被忽略。这跟cout,stdout,printf等有关系吗? – latreides 2013-04-11 15:50:39