在使用 cin 的情况下,无论如何这不是一个可行的解决方案
这是您问题中的杀手级细节。这在纸上很简单,只需首先调用 AttachConsole(ATTACH_PARENT_PROCESS) 来尝试附加到现有控制台。当您的程序从诸如资源管理器之类的 GUI 程序或桌面快捷方式启动时,这将失败。因此,如果它返回 FALSE,则调用 AllocConsole() 来创建您自己的控制台。
然而,使用cin是一个问题。命令处理器会注意您的 EXE 并检查它是控制台模式应用程序还是 GUI 应用程序。它会在您的情况下检测 GUI 应用程序,然后不等待该过程完成。它再次显示提示并等待输入。然后,您还将等待输入,但您会输,命令处理器首先到达那里。您的输出还与命令提示符混合在一起,这是很容易解决的问题。
有一个简单的解决方法,您的用户应该启动您的程序,start /wait yourapp
告诉命令处理器等待该过程完成。问题是:没有人使用它。并且用户不会意识到当他们键入输入时会发生什么,打算将其输入您的程序,但它实际上是由命令处理器解释的。产生神秘的错误信息或格式化硬盘。
只有两种好方法可以解决这个无法解决的问题。将您的程序构建为控制台模式应用程序,并在您发现要显示 GUI 时调用 FreeConsole()。或者总是调用 AllocConsole()。这些都不是很好的选择。第一种方法是 Java JVM 在 Windows 上使用的方法。针对 JVM 提出的最古老的错误之一,使 Java 程序员完全无法从闪烁的控制台窗口中获取信息。
第三种选择是唯一不错的选择,并且您不想要的选择创建另一个始终使用控制台的 EXE。像 Java 一样,javaw.exe 与 java.exe。
一个技巧是可能的,您可以将该文件从“yourapp2.exe”重命名为“yourapp.com”。当用户在命令行提示符下键入“yourapp”时,它将首先被选中,桌面快捷方式仍然可以指向“yourapp.exe”。Visual Studio 使用了这个技巧,devenv.com vs devenv.exe。