Исключение Delphi DLL закрывает мое приложение

#delphi #exception #dll #exception-handling #delphi-2010

#delphi #dll #исключение #delphi-2010

Вопрос:

У меня есть библиотека DLL Delphi 2010, загруженная в приложение Delphi 2010. Большую часть времени оно работает нормально. Но есть некоторые исключения, которые выходят из библиотеки DLL (даже те, которые обрабатываются try..except блоком), и мое приложение завершает работу без сообщения об ошибке, вообще без информации. Исключения, о которых я говорю, похожи на AV, а не на исключения, созданные разработчиком. Я пытался загрузить DLL с SafeLoadLibrary , но безуспешно. У меня также есть исходный код приложения и DLL. Я не публикую DLL или исходный код приложения, потому что я не могу, они защищены авторским правом (я действительно хотел бы, чтобы я мог).

Могу ли я что-нибудь сделать, чтобы избежать внутреннего исключения DLL, приводящего к сбою моего приложения?

Редактировать

У меня нет способа запретить DLL вызывать исключение. Это может случиться, не все коды идеальны. Может быть неизбежным, что dll вызывает исключение, но это не должно привести к сбою основного приложения. Представьте, например, что вы используете стороннюю библиотеку dll, исходного кода которой у вас нет. нехорошо, что при сбое этой dll по какой-либо причине ваше основное приложение будет убито. У него должен быть способ не допустить, чтобы это произошло.

Комментарии:

1. попробуйте повторить ошибки в небольшой программе и опубликуйте здесь код.

2. Я попытаюсь, но иногда они закрывают мое приложение, иногда нет.

3. У вас должна быть функция Try / Except для тела каждой экспортированной функции из вашей DLL.

4. Рафаэль, попробуй использовать MadExcept или JVCLStack, чтобы получить состояние всей памяти при сбое вашего приложения.

5. @Rafael Я повторяю, если вы не можете его перехватить, и это приводит к сбою всего, тогда у вас нет выбора, кроме как остановить это в первую очередь, что бы это ни было. Вашей первой задачей должно быть изолировать то, что не является исключением, но что выводит ваше приложение из строя. Для меня это звучит как вызов TerminateProcess() или что-то подобное.

Ответ №1:

То, о чем вы просите, невозможно. Библиотеки DLL используют то же пространство памяти, что и выполняющийся процесс. Таким образом, любой из них может привести к сбою приложения.

У вас действительно есть правильная идея, в том смысле, что ваша DLL должна делать то, что она может. Оно должно быть добросовестным гражданином в пространстве процесса приложения.

Некоторые вещи, которые вы можете сделать, чтобы быть хорошими.

  • Оберните каждую экспортируемую функцию блоком try / except и корректно обработайте исключения.
  • Во время тестирования используйте SafeMM для проверки проблем с памятью, которые вы, возможно, не обнаружили иным способом.
  • Убедитесь, что вы не передаете управляемые типы Delphi