【问题标题】:Win GUI App started from Console => print to console impossible?Win GUI App 从控制台启动 => 打印到控制台不可能?
【发布时间】:2011-06-21 13:05:20
【问题描述】:

这不是另一个经常讨论的“我的 GUI 应用程序中需要一个控制台”。我的情况与此不同。

我有一个从命令行运行的 Windows GUI 应用程序。现在,如果您向此应用程序传递错误的参数,我确实希望出现一个弹出窗口来说明可能的开关,但我希望将其打印到产生我的进程的控制台中。

我已经做到了可以打印到控制台(为父进程调用 AttachConsole(...)),但问题是我的应用程序没有“阻塞”。一旦我启动它,命令提示符就会返回,并且所有输出都会写入这个窗口(参见附图以进行说明)。

我玩了一下,创建了一个控制台应用程序,运行它,然后看到那里,它“阻塞”了,提示仅在应用程序终止后重新出现。将我的 GUI 应用程序切换到 /SUBSYSTEM:Console 会导致奇怪的错误(MSVCRTD.lib(crtexe.obj):错误 LNK2019:函数“___tmainCRTStartup”中未解析的外部符号“_main”。)

我已经看到来自 MSDEV 的带有“.exe”和“.com”文件方法的管道方法,但我觉得它很糟糕。有没有办法解决这个更漂亮的问题?

【问题讨论】:

  • 更改为控制台子系统听起来是正确的做法。不过,您必须更改主声明以与控制台应用程序保持一致。除了 AFAIK 之外,您将无法使用 WinMain 阻止它,因为命令行刚刚启动它。
  • 切换到控制台子系统还有其他副作用。如果从快捷方式而不是控制台窗口启动,它将创建一个新控制台,即使快捷方式提供了正确的参数。

标签: winapi console-application


【解决方案1】:

这不是您可以通过修改应用程序来改变的行为(除了已经讨论过的重新标记它)。命令解释器查看可执行文件所标记的子系统,并相应地决定是否等待应用程序终止。 If the executable is labelled as having a GUI, then the command interpreter doesn't wait for it to terminate.

在某些命令解释器中,这是可配置的。例如,在JP Software's TCC/LE 中,可以configure the command interpreter to always wait for applications to terminate,甚至是GUI 的。但是,在 Microsoft 的 CMD 中,这是不可配置的行为。 Microsoft 的答案是使用START command/WAIT 选项。

再说一次:这不是你的应用程序的行为。除了重新标记为 TUI 程序之外,没有任何涉及您的代码的编程方式来改变这一点。

【讨论】:

    【解决方案2】:

    也许编写一个基于控制台的包装应用程序来检查参数,打印错误参数的错误消息,并在参数正确时调用/启动实际程序?

    【讨论】:

    • 这就是我试图避免的 :( 上面提到的 MSDEV 解决方案恰好有这样一个“.com”文件包装应用程序,它在 Windows 控制台中具有优先级,所以当你输入“myapp”时 [return ] 它将首先尝试启动“myapp.com”,然后是“myapp.exe”,但这是一个独立的应用程序,我不想分发多个文件。该解决方案应包含在单个应用程序中以确保它不会当有人忘记拖动这两个部分时中断。
    猜你喜欢
    • 1970-01-01
    • 2017-11-18
    • 1970-01-01
    • 2012-02-07
    • 2015-05-04
    • 2016-11-19
    • 2018-07-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多