将STDIN与AllocConsole()一起使用

时间:2012-01-26 15:45:41

标签: c++ winapi windows-console

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

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

4 个答案:

答案 0 :(得分:14)

感谢Ben Voigt,我通过执行以下操作后可以让控制台接收输入:

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

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

答案 1 :(得分: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输出。

答案 2 :(得分:2)

这是适用于我的代码:

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

您可以使用CONIN$stdin执行类似操作(当然,请打开以供阅读)。

答案 3 :(得分:1)

这就是我使用的。

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

希望这有助于某人。