将STDIN与AllocConsole()一起使用

Using STDIN with an AllocConsole()

本文关键字:一起 STDIN AllocConsole      更新时间:2023-10-16

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

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

多亏了Ben Voigt,我能够在分配后让控制台接受输入,方法是:

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

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

这就是我使用的。

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

只是希望这能帮助到别人。

是否也将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输出。

这是适用于我的代码:

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

您可能可以对CONIN$stdin执行类似的操作(当然是开放阅读)。