【问题标题】:Using STDIN with an AllocConsole()将 STDIN 与 AllocConsole() 一起使用
【发布时间】:2012-01-26 15:45:41
【问题描述】:

我有一个第三方 dll,我将它加载到不属于我的软件中,并且我正在使用 AllocConsole() 创建标准 Windows CLI 窗口,因此我可以轻松地输出调试消息。

我的问题是,它忽略了任何类型的输入。 我只是希望能够使用我分配的控制台并让我能够给它一些输入。

【问题讨论】:

  • 我假设这是在 MS Windows 上,因为 AllocConsole 是 Microsoft API。适当地重新标记。
  • 它还在我的帖子中提到了 windows CLI,因此无需做出任何假设。感谢您重新标记。

标签: c++ winapi windows-console


【解决方案1】:

感谢 Ben Voigt,我能够在分配输入后让控制台接受输入:

freopen("CONIN$", "r", stdin); 
freopen("CONOUT$", "w", stdout); 
freopen("CONOUT$", "w", stderr); 

这也将 stdout 和 strerr 定向到同一个控制台窗口,以防它们因某种原因被定向到其他地方。

【讨论】:

  • 如果它对任何人有帮助,使用 VS2013 我无法通过 FreeConsole 关闭控制台而不“放回”stdout/stderr:freopen("OUT", "w", stdout);
  • freopen("NUL", "w", stdout) 更好... "OUT" 在当前文件夹中创建一个名为 "OUT" 的文件,而 NUL 是空输出,因此丢弃所有内容。 CONOUT$ 可能会更好......不确定它是如何工作的。
  • 注意freopen 实现UCRT 中的问题: 1. 它不重用0-2 个描述符,要重用它们,您必须先关闭它们:const int stdin_fileno = _fileno(stdin); fclose(stdin); if (stdin_fileno < 0) _close(STDIN_FILENO);。 2. 如果不是控制台应用程序(GUI),它将忽略SetStdHandle_dup2 也忽略它),您必须显式调用它。
【解决方案2】:

您是否还将stdoutstderr重定向到您的控制台?

我使用此代码从 Windows 应用程序访问 JavaVM 输出。

if(::AllocConsole())
    {
        int hCrt = ::_open_osfhandle((intptr_t) ::GetStdHandle(STD_OUTPUT_HANDLE), _O_TEXT);
        FILE *hf = ::_fdopen( hCrt, "w" );
        *stdout = *hf;
        ::setvbuf(stdout, NULL, _IONBF, 0 );

        hCrt = ::_open_osfhandle((intptr_t) ::GetStdHandle(STD_ERROR_HANDLE), _O_TEXT);
        hf = ::_fdopen( hCrt, "w" );
        *stderr = *hf;
        ::setvbuf(stderr, NULL, _IONBF, 0 );
    }

在此之后,我可以看到来自 VM 的所有 stdoutstderr 输出。

【讨论】:

  • 我已经指定了 stdout 和 stderr 是的,但我仍然无法将 CLI 窗口用于 STDIN。当我尝试正确设置标准输入时,窗口仍然拒绝输入。
  • 标准句柄与程序启动后创建的控制台无关。如果先完成,其余的可能会起作用。
【解决方案3】:

这是适合我的代码:

freopen("CONOUT$", "w", stdout);

您可能可以使用CONIN$stdin 做类似的事情(当然是开放阅读)。

【讨论】:

    【解决方案4】:

    这是我使用的。

        FILE *file = nullptr;
    freopen_s(&file,"CONIN$", "r", stdin);
    freopen_s(&file, "CONOUT$", "w", stdout);
    

    只是希望这对某人有所帮助。

    【讨论】:

      猜你喜欢
      • 2011-08-18
      • 1970-01-01
      • 2019-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多