![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Объект из динамически загружаемой bpl
Slym © (2010-03-26 12:42:00)наткнулся на грабли:
hpkg:=LoadPackage('package.bpl');
try
packageObj.SomeProc;//raised exception TSomeCustomPackageException
finally
UnLoadPackage(hpkg);
end;
//тут AV
оказывается ругается на TSomeCustomPackageException который в другом "подчиненном" пакете и загружается неявно при загрузке моего пакета
как проверить что пакет неявно чтото наплодил? чтоб все это грохнуть и закрыть пакет?
Slym (2010-03-28 17:47:00) [21]Игорь Шевченко © (28.03.10 17:18) [12]
все вяжется:
Exception - известен
type ESomeException=class(Exception) - неизвестен
Игорь Шевченко (2010-03-28 17:18:00) [22]
> мне на данном этапе известен только базовый Exception
и
> предложи способ отделить известное исключение от неизвестного,
>
Как-то не вяжется, не правда ли ?
Slym (2010-03-28 17:17:00) [23]Loginov Dmitry © (28.03.10 15:13) [9]
метода доступа может смениться, положат длугой БПЛ и нафик не нужны BPL-пакеты Indy
тоже касаемо bpl БД - БД сменится и нафик adortl
приложение скомпилировано с rtl,vcl,dbrtl,ModuleManager - в котором и реализована плагин начинка
Slym (2010-03-28 17:12:00) [24]Игорь Шевченко © (28.03.10 14:01) [8]
мне на данном этапе известен только базовый Exception
а все остальные в т.ч. и "неизвестные" исключения пролезут в фильтр E is Exception
if E is Exception then //не канает т.к. все исключения наследованы от Exception
Loginov Dmitry (2010-03-28 15:13:00) [25]
if E.ClassName = 'EIdSocketError' then
raise Exception.Create(E.Message)
else
raise;
Не проще ли подключить к EXE и к BPL одни и те же BPL-пакеты с Indy ?
Игорь Шевченко (2010-03-28 14:01:00) [26]
> предложи способ отделить известное исключение от неизвестного,
> находящегося в выгружаемом модуле вот тут:
if E is известное_исключение then
Slym (2010-03-28 12:49:00) [27]Игорь Шевченко © (26.03.10 15:13) [4]
это в 5 утра писалось, 6 часов убил на локализацию плавающего AV
Сергей М. © (26.03.10 15:29) [5]
Ну ты и загнул с классом исключения)
предложи способ отделить известное исключение от неизвестного, находящегося в выгружаемом модуле вот тут:
procedure RaiseException(E:Exception);
begin
Log(E.Message);
//if E.ClassName='Exception' then //???
//if E is Exception then //не канает т.к. все исключения наследованы от Exception
//if E.ClassType=Exception then
//неизвестный мне вариант
raise E
else
raise Exception.Create(e.Message);
end;
а кому то и смешно но пока работает :)
Loginov Dmitry © (27.03.10 12:18) [6]
выгрузить необходимо
Loginov Dmitry (2010-03-27 12:18:00) [28]
> finally
> UnLoadPackage(hpkg);
> end;
> //тут AV
А зачем его выгружать? Раз разгрузил - и пусть висит.
Естественно на Finally при нестандартном исключении будет AV, ибо происходит обработка объекта исключения с уже выгруженными из памяти методами.
Сергей М. (2010-03-26 15:29:00) [29]
> Slym © (26.03.10 13:56) [3]
Ну ты и загнул с классом исключения)
Курам ведь насмех !)
Игорь вон чуть не упалпацтул" )
А ведь ты вроде и не новичок, чтобы такие смешные ляпы допускать ...
Игорь Шевченко (2010-03-26 15:13:00) [30]
> if E.ClassType=Exception then
Гы
Slym (2010-03-26 13:56:00) [31]Игорь Шевченко © (26.03.10 12:46) [1]
что тут перепроектировать?
хост приложение о коммуникациях ничего не знает
загрузил пакет...
(тут неавная подгрузка IndyProtocols)
выполнил функцию из пакета
(тут исключение EIdSocketError)
закрыл все что явно открыл
выгрузил
(но эксепшн EIdSocketError остался) AV
проблему решил отловом нестандартных исключений и "переформатированием" в стандартные
except
on
if E.ClassType=Exception then
raise
else
raise Exception.Create(e.Message);
end;
Сергей М. (2010-03-26 13:06:00) [32]
> как проверить что пакет неявно чтото наплодил?
Вестимо как - использовав встроенный отладчик.
Игорь Шевченко (2010-03-26 12:46:00) [33]
> как проверить что пакет неявно чтото наплодил?
Пакеты перепроектировать