Здравствуйте, D. Lex, Вы писали:
V>>и что Вы предлагаете использовать в таких случаях вместо (detours)?
DL>Ничего. Или detours.
Чтобы ловить необработанные исключения вовсе не обязательно ставить хук на системные функции. С технической точки зрения — да, Uhnandled Filter может быть только один, но на практике кроме CRT (при инициализации) никто больше не вызывает SetUnhExcFilter, а CRT ведет себя по джентльменски — запоминает адрес предыдущего обработчика и передает управление ему после выполнения своего кода. Соответственно, если все фильтры необработанных исключений будут придерживаться такой тактики — запомнить адрес предыдущего и передать управление ему, если исключение не было обработано, — то необходимости использовать хук нет.
CRT-шный UnhandledExceptionFilter имеет обыкновение ловить C++ исключения, для которых не нашлось подходящего блока catch. Поэтому,
— если использовать подход описанный в статье, — мы будем ловить все исключения, но CRT перестанет получать управление, будет несоответствие стандарту — в случае необработанного исключения перестанет вызываться terminate
— если оставить UEF от CRT, то наш UEF будет вызываться после CRT-шного, но не будет получать C++ исключения, т.к. для них CRT вызовет terminate (показав напоследок messagebox с невнятным сообщением "program requested ...")
имхо разумный компромисс:
— использовать SetUnhandledExceptionFilter, но не обрабатывать C++ исключений (чтобы не конфликтовать с CRT)
— для необработанных C++ исключений использовать в каждом потоке set_terminate (например, сделать dll и ловить события thread_attach и thread_detach). в обработчике terminate выполнять нужную обработку.
минус этого подхода в том, что внутри terminate() нельзя добраться до текущего исключения, из-за которого разгорелся сыр-бор (или почти нельзя — покопавшись в недокументированных SEH структурах на стеке текущее исключение выудить можно для большинства случаев)
Все это имеет отношение к W2K.
На Windows 2003 появились векторные обработчики исключений, благодаря которым можно было бы попробовать решить ту же проблему более изящно — не конфликтуя с CRT и не используя hook.