Проблемы с SEH

Тема в разделе "WASM.WIN32", создана пользователем Mescalito, 1 авг 2006.

Статус темы:
Закрыта.
  1. Mescalito

    Mescalito New Member

    Публикаций:
    0
    Регистрация:
    31 мар 2005
    Сообщения:
    78
    Адрес:
    Харьков
    Некоторое время я юзаю DLL собственного написания в которой среди всего прочего с помощью SetUnhandledExceptionFilter ставится мой обработчик, который выводит в консоль инфу об ошибке. Пока я юзал её в простых консольных прогах (главный exe + эта dll) никаких проблем не возникало, но сейчас я решил подключить её к более сложному приложению и наткнулся на непонятную проблему. Обработчик отказывается выводить что-либо в консоль: WriteConsole возвращается с ошибкой ERROR_INVALID_HANDLE, хотя хэндл на вид вполне нормальный. Путём серьёзной кастрации двух программ довёл их до вида, который вы можете увидеть во вложении. В первом примере исключение возбуждается в главном модуле, во втором - в другой dll. Может кто-нибудь знает почему WriteConsole работает в первом случае и не работает во втором и как с этим бороться?
     
  2. Mescalito

    Mescalito New Member

    Публикаций:
    0
    Регистрация:
    31 мар 2005
    Сообщения:
    78
    Адрес:
    Харьков
    Опытным путём я установил, что чтобы заставить программу работать необходимо вызывать в обработчике исключения AllocConsole и GetStdHandle (а если консоль уже была создана, то перед этим ещё и FreeConsole), т. е. исключение вне главного модуля каким-то образом "портит" стандартный поток вывода, причём не хэндл, а именно поток, т. к. вызов в обработчике одного только GetStdHandle проблемы не решает. Неужели никто не знает, почему исключение портит поток (хотя не должно) в одном случае и не портит в другом? Конечно, можно всё-таки выделять новую консоль в обработчике, но это лишает код красоты, а программу гибкости :dntknw:
     
  3. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Никто ничего не портит ;) Просто у тебя в test2 GUI "затесался", поэтому консоль по умолчанию не создается. Убери GUI и все будет нормально
     
  4. Mescalito

    Mescalito New Member

    Публикаций:
    0
    Регистрация:
    31 мар 2005
    Сообщения:
    78
    Адрес:
    Харьков
    Да. Затесался. Но дело не в этом. Хоть GUI, хоть не GUI - всё равно не работает (проверил только что). Отсутствие консоли здесь ни причём. Если я в dllmain или в отдельной функции инициализации вызываю AllocConsole это всё равно не помогает. Во втором примере удаётся что-либо вывести в консоль только вызвав AllocConsole непосредственно в обработчике исключений
     
  5. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Ну не знаю, если убрать GUI в test2, то у меня выводится сообщение Hello world
    А экспериментировать с AllocConsole сейчас времени нет, да и особого желания :))
     
  6. Mescalito

    Mescalito New Member

    Публикаций:
    0
    Регистрация:
    31 мар 2005
    Сообщения:
    78
    Адрес:
    Харьков
    А чёрт. Действительно, работает, если убрать GUI
    Всё, в следующий раз проверять буду по-трезвому :)
    Спасибо. Тему можно закрывать
     
Статус темы:
Закрыта.