Единственный способ создать надежную оболочку DLL - это загрузить ошибочную DLL в другой процесс, чтобы в случае сбоя он не затормозил ваш основной процесс.
Поймать все исключения C ++ кажется разумным, но перехват всех структурированных исключений - это другая история. SEH может показаться , что поможет вам пройти большую часть пути, потому что он позволяет выявлять нарушения доступа, исключения деления на ноль и т. Д.
Но что, если глючная DLL коснется незафиксированной страницы из стека другого потока? Доступ к памяти приведет к сбою страницы, будет вызван обработчик исключений, и теперь эта страница больше не является защитной страницей. Когда этому потоку нужно увеличить стек, он получит нарушение прав доступа, и процесс завершится сбоем. ( Эти сообщений описывают этот случай более подробно.)
Другая вероятная проблема: глючная DLL-библиотека аварийно завершает работу, удерживая объект синхронизации, но вы используете SEH, чтобы перехватить исключение. Если ваш процесс пытается получить тот же объект синхронизации, он блокируется вместо сбоя. Общий объект синхронизации может быть частью среды выполнения C или ОС: что, если глючная DLL 1 загружает глючную DLL 2, которая вылетает в DllMain()
, пока глючная DLL 1 удерживает блокировку загрузчика? Будет ли ваш процесс тупиковым при следующей загрузке DLL?
Для получения дополнительной информации о том, почему это (и такие функции, как IsBadReadPtr()
, которые имеют аналогичные проблемы) является неправильным использованием SEH: