Некоторое время я юзаю DLL собственного написания в которой среди всего прочего с помощью SetUnhandledExceptionFilter ставится мой обработчик, который выводит в консоль инфу об ошибке. Пока я юзал её в простых консольных прогах (главный exe + эта dll) никаких проблем не возникало, но сейчас я решил подключить её к более сложному приложению и наткнулся на непонятную проблему. Обработчик отказывается выводить что-либо в консоль: WriteConsole возвращается с ошибкой ERROR_INVALID_HANDLE, хотя хэндл на вид вполне нормальный. Путём серьёзной кастрации двух программ довёл их до вида, который вы можете увидеть во вложении. В первом примере исключение возбуждается в главном модуле, во втором - в другой dll. Может кто-нибудь знает почему WriteConsole работает в первом случае и не работает во втором и как с этим бороться?
Опытным путём я установил, что чтобы заставить программу работать необходимо вызывать в обработчике исключения AllocConsole и GetStdHandle (а если консоль уже была создана, то перед этим ещё и FreeConsole), т. е. исключение вне главного модуля каким-то образом "портит" стандартный поток вывода, причём не хэндл, а именно поток, т. к. вызов в обработчике одного только GetStdHandle проблемы не решает. Неужели никто не знает, почему исключение портит поток (хотя не должно) в одном случае и не портит в другом? Конечно, можно всё-таки выделять новую консоль в обработчике, но это лишает код красоты, а программу гибкости
Никто ничего не портит Просто у тебя в test2 GUI "затесался", поэтому консоль по умолчанию не создается. Убери GUI и все будет нормально
Да. Затесался. Но дело не в этом. Хоть GUI, хоть не GUI - всё равно не работает (проверил только что). Отсутствие консоли здесь ни причём. Если я в dllmain или в отдельной функции инициализации вызываю AllocConsole это всё равно не помогает. Во втором примере удаётся что-либо вывести в консоль только вызвав AllocConsole непосредственно в обработчике исключений
Ну не знаю, если убрать GUI в test2, то у меня выводится сообщение Hello world А экспериментировать с AllocConsole сейчас времени нет, да и особого желания )
А чёрт. Действительно, работает, если убрать GUI Всё, в следующий раз проверять буду по-трезвому Спасибо. Тему можно закрывать