lat*_*des 4 c++ windows console cout cin
我的应用程序是一个GUI应用程序,通过终端(通过cout)提供有用的(虽然是可选的)信息.
在Windows中我要么出现一个控制台(通过编译为控制台应用程序,或动态分配),或者我没有.
我的目的是使用控制台,如果它是从控制台运行,但如果不是,则完全忽略控制台.(基本上是在Linux和OS X中发生的事情).
我不希望重定向到文件(在使用cin的情况下,这不是一个可行的解决方案).
有没有办法将Windows中的GUI应用程序连接到运行它的控制台,当且仅当它从控制台运行时?
Han*_*ant 13
在使用cin的情况下,无论如何这不是一个可行的解决方案
这是您问题中的杀手细节.它很简单,只需首先调用AttachConsole(ATTACH_PARENT_PROCESS)来尝试连接到现有控制台.当您的程序从Explorer或桌面快捷方式等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.