AllocConsole и стандартный ввод / вывод - PullRequest
0 голосов
/ 24 марта 2020

У меня проблемы с FreeConsole / AllocConsole и их связью со stdio (stdin / stdout / stderr стандартные файловые указатели). Я успешно использовал эту последовательность в течение многих лет:

int main(int argc, char **argv)
{
    FreeConsole();
    AllocConsole();
    freopen("CONIN$", "rb", stdin);
    freopen("CONOUT$", "wb", stdout);
    freopen("CONOUT$", "wb", stderr);

(см., Например, этот вопрос ). Однако на Windows10 с последними обновлениями я получаю исключение 0xC0000008 в freopen. Обратите внимание, что

  1. Я вижу это только во время сеансов отладки (VS2017, настройка отладки). Кажется, что нормальный запуск приложения и конфигурация выпуска также работают (или, может быть, исключение молча игнорируется?).
  2. Это происходит очень часто, но не повторяется. Иногда первый freopen терпит неудачу, иногда второй, иногда третий, иногда ни один из них.
  3. Отладчик перехватывает исключение (я знаю, я мог бы отключить его, но я бы предпочел этого не делать, поскольку это интересное событие в целом). Когда я принудительно продолжаю программу, программа, кажется, работает правильно. Однако я совсем не уверен, что состояние ЭЛТ все еще безопасно.
  4. Если я добавлю fclose(stdin); fclose(stdout); fclose(stderr) до FreeConsole, исключение произойдет в FreeConsole.

Вопросы:

  • Что-то не так в приведенной выше последовательности?
  • Как правильно подключить стандартные файловые указатели к новой консоли?
  • Есть ли способ избежать этого исключения (т.е. убедиться, что это не произойдет, а не просто молча игнорировать)? Это довольно раздражает в моих сеансах отладки.

Дополнительная информация:

  • Я использую VS2017, но программа использует набор инструментов VS2013.
  • Программа скомпилирована для x86 (32 бита).
  • В настройках Debug и Release используются библиотека DLL-Multithread (/ MD) и многобайтовый набор символов.
  • ОС - Windows10 -64 Professional 1903 - 18362.720

Спасибо заранее

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...