Перехват исключений в библиотеке.

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Ответить
buls
незнакомец
Сообщения: 7
Зарегистрирован: 07.04.2006 08:01:44

Сообщение buls »

Здравствуйте!
компилирую в FPC следующую DLL:

Код: Выделить всё

library mydll;
uses
  SysUtils, Windows;

procedure Test();
var
i,i2,i3: integer;
begin
try
i:=100;
i2:=0;
i3:=i div i2; // Попытка деления на ноль
except
  on EDivByZero do
  MessageBoxA(0,'Попытка деления на ноль перехвачена в библиотеке','',MB_OK);
end;
end;

exports
Test name 'Test';

begin
end.  


В экспортируемой из этой библиотеки функции Test происходит деление на ноль.
Далее в FPC компилирую програмульку, вызывающую функцию Test из этой библиотеки:

Код: Выделить всё

program project;
uses
SysUtils, Windows;

procedure Test; external 'mydll.dll';

begin
try
Test;
except
  on EDivByZero do
  MessageBoxA(0,'Попытка деления на ноль перехвачена в программе','',MB_OK);
end;
end.  


Проблема состоит в том, что блок try..except в библиотеке не обрабатывает это исключение, обработка исключения происходит только в программе, а мне нужно, чтобы обработка происходила именно в библиотеке и не выходила наружу.
Подскажите, пожалуйста, как можно исправить данную ситуацию?
Аватара пользователя
bw
постоялец
Сообщения: 359
Зарегистрирован: 01.12.2005 10:36:23
Откуда: Усть-Илимск
Контактная информация:

Сообщение bw »

Есть особенность динамической и статической "сборки" приложения/библиотеки в Delphi. Что-то, наверное и в fp искать нужно. Я говорю о динамическом подлключении .bpl в котором и находится SysUtils, EDivByZero и т.д. Хотя мне чувствуется что проблема кроется немного в другом. Попробуй библиотеку и программу собрать в Delphi с исполнением с "runtime пакетакми" (как-то так, что бы они динамически подключали SysUtils, кажется rtl*.bpl).

..bw
buls
незнакомец
Сообщения: 7
Зарегистрирован: 07.04.2006 08:01:44

Сообщение buls »

Попробовал собрать то же самое в Delphi, компилировал и с включенными runtime пакетами и без них, все исключения перехватываются в библиотеке без проблем. В Delphi придраться не к чему, видать проблема в FPC, пробовал 1.0.6, 2.0.2 и 2.1.1 версиями компилятора собирать библиотеку, всё равно исключения не обрабатываются.
volvo877
незнакомец
Сообщения: 8
Зарегистрирован: 04.09.2005 14:34:53

Сообщение volvo877 »

buls,
только что попробовал собрать в FPC 2.0.0 - все нормально ловится.
Janus
постоялец
Сообщения: 134
Зарегистрирован: 07.11.2005 16:06:49

Сообщение Janus »

А вот в 2.0.2 перехват осуществляется в программе. Странно.
buls
незнакомец
Сообщения: 7
Зарегистрирован: 07.04.2006 08:01:44

Сообщение buls »

Volvo877, попробовал в 2.0.0, всё равно ловит только в программе. А с какими параметрами компилировали? Может просто я что-то не так делаю.
buls
незнакомец
Сообщения: 7
Зарегистрирован: 07.04.2006 08:01:44

Сообщение buls »

Всё, нашёл ответ на свой вопрос. Это непофиксенный баг компилятора <a href='http://www.freepascal.org/bugs/showrec.php3?ID=2573' target='_blank'>http://www.freepascal.org/bugs/showrec.php3?ID=2573</a>. Надеюсь в следующих версиях исправят.
Ответить