Сразу поясню что зачем.
Есть dll на Lazarus, в ней 500 экспортируемых функций.
Задача: возникающие в коде dll Exception не должны выходить за пределы экспортируемых функций.
Понятно, что можно (нужно?) в каждой экспортируемой функции написать шаблон вида
function SomeExportFunc(...): Integer;
begin
try
SomeExportFunc_body(...);
except
Result := ErrorCode;
end;
end;
Но, как я уже написал, dll давно готова, куча экспортируемых функций, вставлять в каждую - тоскливо. Можно попробовать автоматизировать изготовление оберток, но есть еще надежда на волшебный вариант.
Волшебный вариант видится в том, что при возникновении Exception где-то глубоко по факту будет вызываться некая наша функция, которая будет фиксировать ошибку - а далее будет просо производиться штатный выход из SomeExportFunc().
Поизучал вот здесь
http://wiki.freepascal.org/Logging_exceptionsно как-то не особо успешно, признаться. Как сделать желаемое волшебство - все равно не понимаю, ведь в
fpc\2.6.0\source\rtl\inc\except.inc
видим следующее:
Procedure DoUnHandledException;
....
_ExceptObjectStack:=ExceptObjectStack;
If (ExceptProc<>Nil) and (_ExceptObjectStack<>Nil) then
with _ExceptObjectStack^ do
begin
TExceptProc(ExceptProc)(FObject,Addr,FrameCount,Frames);
halt(217)
end;
....
т.е. какие-бы обработчики не ставил - там заканчивается все всегда одним, а именно - halt(), что, на сколько я понимаю, приводит к остановке процезза безальтернативно.
Подскажите: реализуемо ли желаемое волшебство? если да - то как именно?