У меня проблемы с 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
. Обратите внимание, что
- Я вижу это только во время сеансов отладки (VS2017, настройка отладки). Кажется, что нормальный запуск приложения и конфигурация выпуска также работают (или, может быть, исключение молча игнорируется?).
- Это происходит очень часто, но не повторяется. Иногда первый freopen терпит неудачу, иногда второй, иногда третий, иногда ни один из них.
- Отладчик перехватывает исключение (я знаю, я мог бы отключить его, но я бы предпочел этого не делать, поскольку это интересное событие в целом). Когда я принудительно продолжаю программу, программа, кажется, работает правильно. Однако я совсем не уверен, что состояние ЭЛТ все еще безопасно.
- Если я добавлю
fclose(stdin); fclose(stdout); fclose(stderr)
до FreeConsole
, исключение произойдет в FreeConsole
.
Вопросы:
- Что-то не так в приведенной выше последовательности?
- Как правильно подключить стандартные файловые указатели к новой консоли?
- Есть ли способ избежать этого исключения (т.е. убедиться, что это не произойдет, а не просто молча игнорировать)? Это довольно раздражает в моих сеансах отладки.
Дополнительная информация:
- Я использую VS2017, но программа использует набор инструментов VS2013.
- Программа скомпилирована для x86 (32 бита).
- В настройках Debug и Release используются библиотека DLL-Multithread (/ MD) и многобайтовый набор символов.
- ОС - Windows10 -64 Professional 1903 - 18362.720
Спасибо заранее