【问题标题】:One executable that starts as a GUI application or console application based on command line in Visual Studio 2005在 Visual Studio 2005 中基于命令行作为 GUI 应用程序或控制台应用程序启动的一个可执行文件
【发布时间】:2010-10-20 19:14:22
【问题描述】:

我在Visual Studio 2005 中有一个Qt 应用程序,它使用\subsystem:windows 链接,这样当我运行编译后的可执行文件时,它也不会创建命令行终端。

我想创建一个命令行模式:当我使用--nogui 命令行参数启动它时,GUI 不会出现,但会运行一个简单的命令行程序。由于链接使用/subsystem:windows,因此命令行模式不会显示任何std::cout 输出,除非我将可执行文件与\subsystem:console 链接。

有没有办法设置编译/链接,以便同一个可执行文件可以呈现 GUI 窗口或根据命令行参数作为控制台应用程序运行?

附言。我使用 Qt 4.2.0 和 Visual Studio 2005,项目是 C++。

【问题讨论】:

    标签: c++ visual-studio qt visual-studio-2005


    【解决方案1】:

    我认为这里情况的首选技术是“.com”和“.exe”方法。在 Windows 中,如果您从命令行运行程序并且未指定扩展名,则查找可执行文件的优先顺序将为 .com preferred over a .exe file

    然后您可以使用技巧让“.com”成为 stdin/stdout/stderr 的代理并启动同名的 .exe 文件。这给出了允许程序在从控制台调用时以命令行模式执行的行为(可能仅在检测到某些命令行参数时),同时仍然能够作为没有控制台的 GUI 应用程序启动。

    有很多文章对此进行了描述,例如“如何将应用程序作为 GUI 和控制台应用程序?” (请参阅下面链接中的参考资料)。

    我主持了一个名为 dualsubsystem on google code 的项目,该项目更新了该技术的旧 codeguru 解决方案,并提供了源代码和工作示例二进制文件。

    希望对你有帮助!

    【讨论】:

      【解决方案2】:

      你不能。请参阅 Raymond Chen 的这篇文章:

      How do I write a program that can be run either as a console or a GUI application?

      由于本文中给出的原因,您有时会看到提供相同工具的两个版本,一个以“w”为后缀,例如 Windows 上的 java.exe 和 javaw.exe。

      但是您可以实施这个巧妙的解决方法:How to make an application as both GUI and Console application

      【讨论】:

      • 抱歉,这个信息在这方面完全是错误的,AllocConsole 可以正常工作。它没有做的是在不存在时创建一个新的控制台——但这没有被问到(因为无论如何都必须在此处输入一个额外的参数才能启动控制台版本)。一些人也对 Raymond 的帖子发表了此评论。
      • 对不起,我的意思是AttachConsole不是 AllocConsole(后者做了其他事情)。另外,我忘记了一个词:“case”。
      • @Konrad:据我了解,AttachConsole 仅在您的父进程是 cmd.exe 时才有效,即从快捷方式使用 --nogui 启动应用程序将不起作用。恕我直言,这个问题没有通用的解决方案,只有一些解决方法。
      • @divo:您的理解确实是正确的(尽管如果父进程不是 cmd.exe,仍然可以退回到AllocConsole - 可以使用其他信息检索的信息WinAPI 函数)。
      【解决方案3】:

      您是否尝试在程序中调用AttachConsole 以将输出重定向到调用终端?

      【讨论】:

      • 能否请您提示我需要哪些头文件和宏定义才能使用 AttachConsole?我试过#include #include ,但显然这还不足以找到AttachConsole函数
      • 文档说包含<windows.h>,这绝对足够了。调用函数的时候忘记参数了吗?
      • AllocConsole() 也可能是合适的:msdn.microsoft.com/en-us/library/ms681944.aspx
      • AllocConsole() 对我有用,即使我从控制台开始,它也会打开一个新控制台。无论如何感谢您的回答
      • 我确实使用 AttachConsole(ATTACH_PARENT_PROCESS) 尝试过,但编译器告诉我没有找到标识符 AttachConsole... 使用 #include
      【解决方案4】:

      要使用 AttachConsole,您需要在包含 之前包含以下行:

      //Require at least Windows XP
      #define _WIN32_WINNT 0x0501
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-07
        • 2014-10-08
        • 2015-11-03
        • 1970-01-01
        相关资源
        最近更新 更多