Я вызываю функцию из DLL, например:
__declspec ( dllimport ) bool dll_function(...); int main() { [...] if (dll_function(...)) { [...] } }
В некоторых случаях данные, которые я передаю в функцию DLL, могут привести к сбою библиотеки DLL. Возможно ли это уловить, чтобы мое приложение также не зависало (без изменения DLL, которую я не создал)?
Вы можете поймать AV с помощью ключевых слов __try и __except в компиляторе MSVC. Не все так полезно, вы не представляете, какой урон был нанесен. Состояние вашей программы может быть повреждено. Куча может быть взорвана, например, вызывая последующий случайный сбой. Размещение DLL в своем собственном процессе и использование IPC для общения с ней - единственный приемлемый подход.
В некоторых случаях данные, которые я передаю в функцию DLL, могут привести к сбою библиотеки DLL.Можно ли это перехватить, чтобы мое приложение также не аварийно завершало работу?
Разве невозможно предотвратить падение DLL, если вы вызываете функцию только с действительными данными?Это должно быть предпочтительным решением в любом случае - но трудно сказать, не зная, какую DLL вы хотите использовать.Но в большинстве случаев вы должны иметь представление о том, что именно «данные» приводят к сбою ...
Попробуйте посмотреть на:
http://msdn.microsoft.com/en-us/library/ms680634%28v=vs.85%29.aspx
и
Код Принудительного фильтра Олега Стародумова (www.debuginfo.com)
http://www.debuginfo.com/articles/debugfilters.html
Однако это фильтр верхнего уровня, а не попытка / отлов. Вы можете перезапустить процесс.
Возможно, вам придется использовать __try для исключений. Опять же, вероятно, лучше исправить проблему или просто потерпеть крах, чем пытаться ее поймать. Я согласен с другими, что вместо того, чтобы подавлять или скрывать аварию, вы должны это исправить. Я не знаю, насколько хорошо вы можете восстановиться после сбоя - будет ли полезно продолжить выполнение после чего-то подобного?
Я не уверен, что это проблема, попробуйте указать правильное соглашение о вызовах. (__stdcall, __cdecl и т. Д.).
__stdcall
__cdecl
Если это не проблема, нам нужно увидеть, что вы передаете функции, и, возможно, код функции, если он у вас есть.