Использование STDIN с AllocConsole () - PullRequest
6 голосов
/ 26 января 2012

У меня есть сторонний dll, который я загружаю в программное обеспечение, которое не принадлежит мне, и я использую AllocConsole () для создания стандартного окна CLI Windows, поэтому у меня есть простой способ вывода сообщений отладки.

Моя проблема в том, что он игнорирует любой тип ввода.Я просто хочу иметь возможность использовать консоль, которую я выделил, и дать мне возможность дать ей некоторую информацию.

Ответы [ 4 ]

14 голосов
/ 28 января 2012

Благодаря Бену Фойгту я смог заставить консоль принимать ввод после того, как я выделил ее, выполнив:

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

Это также направляет stdout и strerr в одно и то же окно консоли, если они по какой-то причине направлены в другое место.

2 голосов
/ 20 апреля 2018

Это то, что я использую.

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

Просто надеюсь, что это кому-нибудь поможет.

2 голосов
/ 26 января 2012

Это код, который работает для меня:

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

Возможно, вы можете сделать что-то подобное с CONIN$ и stdin (конечно, открытым для чтения).

2 голосов
/ 26 января 2012

Вы также перенаправляете stdout и stderr на свою консоль?

Я использовал этот код для получения доступа к выводу JavaVM из приложения Windows.

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 );
    }

После этого я вижу все stdout и stderr выходы с виртуальной машины.

...