【问题标题】:GUI app with redirected stdout stream doesn't return control back to the console具有重定向标准输出流的 GUI 应用程序不会将控制权返回到控制台
【发布时间】:2013-02-13 00:03:56
【问题描述】:

我有一个用 C++(使用 MFC)编写的 GUI Windows 应用程序,它将自身附加到父控制台以通过 stdout 流进行输出。它使用AttachConsole API 和RedirectIOToConsole 方法described here

因此,如果我从常规控制台应用程序(本机具有输出到标准输出)中调用以下行:

_tprintf(_T("Test message.\n"));

我得到了我期望的输出:

但是,如果我从我的 GUI 应用程序(带有附加的父控制台)调用同一行代码,我会得到以下信息,除了控件似乎没有返回到父命​​令提示符窗口(见红色圆圈):

请注意,我可以在父命令提示符窗口中键入,所以它不会挂起,如果我按 Enter 键,它将执行我作为命令键入的任何内容。

那么我没有从我的控制台应用程序调用什么来将控制权返回给父控制台?

【问题讨论】:

    标签: c++ winapi console-application


    【解决方案1】:

    这不是归还控制权。

    当您从命令提示符运行控制台应用程序时,命令提示符会一直等到控制台应用程序完成,因此您会看到控制台应用程序的输出,然后是新的提示符,如您的第一张图片所示。

    当您从命令提示符运行 GUI 应用程序时,命令提示符不会等待 GUI 应用程序完成,因此您通常会看到一个新的提示符,然后是 GUI 应用程序的输出,如下所示:

    C:\>TestGuiProjWithOutputToConsole
    C:\>Test Message.
    _

    正如您所指出的,没有任何问题。你可以输入命令,它们可以工作,只是提示出现在错误的地方。

    您的第二个示例没有显示第二个提示,可能是因为您有一个回车符,所以提示被覆盖了。尝试在测试消息之前输出一个换行符,您应该会看到提示(虽然仍然在错误的位置)。

    您可以通过运行来告诉控制台等待 GUI 应用程序:

    start /wait TestGuiProjWithOutputToConsole

    简而言之,GUI 应用程序不能很好地使用命令提示符,因为它们都在同时运行,输出到同一个控制台,所以它们的输出是混乱的。

    【讨论】:

    • 当我使用 WScript.Shell 对象和 Exec 方法从 ASP 脚本运行我的程序时,会出现此问题。在我的 GUI 应用程序完成将数据输出到 stdout 流之后,它似乎在等待 Enter。我不确定为什么会这样?
    • Exec 将控制权返回给您的代码。大概您编写了一些代码来处理您的 gui 应用程序的输出,而正是这段代码阻塞了,但没有看到您的任何代码,我一无所知。我首先要做的是检查来自 GUI 应用程序的输出行(尤其是最后一行)是否以回车符和换行符正确终止。将输出重定向到一个文件(例如guiapp > output.txt),对 output.txt 进行十六进制转储,并检查每一行是否以“\x0d\x0a”结尾。
    • 我认为它只对\x0a起作用,\x0d重要吗?
    • 通常,您的代码只会显式写入 \x0a(即“\n”),但由于输出流处于文本模式,这将转换为“\x0d\x0a”。确定正在发生的事情的最简单方法是花几秒钟查看十六进制转储。有些代码对行尾非常挑剔,而有些代码则不然。因为我不知道你在用这些数据做什么,所以我不知道这是否重要。我认为这可能是一个问题,因为问题中的第二张图片暗示了格式错误的行尾,并且您还说它正在等待 Enter。
    猜你喜欢
    • 2019-03-15
    • 1970-01-01
    • 1970-01-01
    • 2014-03-17
    • 1970-01-01
    • 2015-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多