Форум: "Потрепаться";
Текущий архив: 2004.10.10;
Скачать: [xml.tar.bz2];
ВнизПередать FIBDatabase в COM-dll Найти похожие ветки
← →
Sergey_Masloff (2004-09-21 20:33) [0]а DLL реализует немодальную форму. Никогда не надо было а тут решил поэкспериментировать.
Вобщем, не получается. Передаю как пойнтеры ссылки на DataBase и Transaction в .dll присваиваю их динамически датасету и работаю. Ну, если датасет не открывать то все нормально. Если открывать то он записывается (естественно) в список датасетов FIBDatabase и после этого ошибка при закрытии главного приложения runtime error 216. В DLL все закрывается корректно все деструкторы отрабатывают. То есть COM объект высвобождается штатно и корректно.
А эта гадость вылезает. Кстати с IBX аналогичный пример работает. Но надо проверить все ли там хорошо. На первый взгляд все нормально память не ест, запросы работают вобщем у кого есть какие мнения.
Пишу специально в потрепаться - вроде и в БД не совсем и в общую не подходит.
← →
Vlad © (2004-09-21 21:51) [1]Была у меня подобная проблема, правда не с COM а с обычной библиотекой. Спасла компиляция с Runtime Packages
(как библиотеки так и хост-аппликации)
← →
Sergey_Masloff (2004-09-21 22:01) [2]Vlad © (21.09.04 21:51) [1]
Володь, привет. Про Runtime знаю не подходит. Обычную dll тоже пока не очень хочется. И почему именно с FIBPlus...
Как в ODAC кошерно сделано - специально три документированых способа работы DLL в одном коннекте с аппликацией. Все расписано.
А тут :( Я уж и в CPU смотрел но ни фига не понятно на чем валится...
← →
Vlad © (2004-09-21 22:20) [3]>Sergey_Masloff (21.09.04 22:01) [2]
Честно говоря, с FIBPlus не работал (чем кстати от IBX отличается?), но судя по твоему рассказу похоже что COM объект при своем уничножении разрушает чего-то в хост-аппликации, т.е. т.е. видимо те объекты, указатели на которые ты передал, поскольку 216 ошибка это тоже самое что EAccessViolation
← →
Sergey_Masloff (2004-09-21 22:28) [4]Vlad © (21.09.04 22:20) [3]
Да особо ничем. Есть несколько фич, глобально пока отличий не вижу. Я как раз сейчас экспериментирую с ними.
Насколько я (пока) докопался - при открытии датасета он себя прописывает в списке датасетов в датабейсе (который в главном приложении). На момент закрытия приложения и разрушения датабейса естественно ни ком-объекта ни датасета уже нет в живых но ссылка на него в датабейзе хранится. Документированых способов удалить ее я не вижу. Впрочем я пока не нашел места где с этой ссылкой делается что-то плохое при разрушении датабейза - вроде попыток обратиться к ней нет. Боюсь что это где-то в секциях финализации происходит в каком-то модуле FIBPlus-ов... Написать им чтоли - все ж лицензионный юзер.
← →
Vlad © (2004-09-21 22:37) [5]Почитай вот это, может частично прояснит ситуацию
http://www.delphikingdom.ru/asp/answer.asp?IDAnswer=10651
и там еще есть несколько вопросов по теме Runtime Error
Вобще, этот глюк с передачей DataSet -ов для меня загадкой остался (кстати, это было с DOA).
А в службу поддержки написать,imho, по-любому не помешает :-)
← →
jack128 © (2004-09-21 22:51) [6]Sergey_Masloff (21.09.04 22:28) [4]
А разве fIbDataSet.DataBase := nil не это делает?? Очень странно..
← →
Sergey_Masloff (2004-09-21 22:56) [7]jack128 © (21.09.04 22:51) [6]
Нет не это... По крайней мере когда это (:= nil) делается в DLL.
Кроме того в "лоховских" IBX ровно то же отрабатывает абсолютно нормально.
← →
jack128 © (2004-09-21 23:23) [8]Sergey_Masloff (21.09.04 22:56) [7]
вот - вот. Я сейчас посмотрел код IBXprocedure TIBCustomDataSet.SetDatabase(Value: TIBDatabase);
begin
// FIDBase: TIBBase;
if (FBase.Database <> Value) then
begin
CheckDatasetClosed;
FBase.Database := Value;
...
end;
procedure TIBBase.SetDatabase(Value: TIBDatabase);
begin
if (FDatabase <> nil) then
FDatabase.RemoveSQLObject(FIndexInDatabase);
...
end
Так что в Фибах глюк. В саппорт нужно обращатся...
← →
Sergey_Masloff (2004-09-22 20:59) [9]jack128 © (21.09.04 23:23) [8]
Неа, в этом месте все в порядке. Судя по тому что если собрать с runtime packages то работает -> дело в инициализациях-финализациях. Я на 99% уверен что это кэш кверей который глобальная переменная инициируемая в initialization модуля.
Вобщем, все что я хотел чтобы работало работает, память вроде бы не течет теперь буду думать - использовать IBX и не знать горя или исп. FIBPlus и быть привязаным к линковке с RUNTIME PACKAGES чего я бы не хотел.
← →
jack128 © (2004-09-22 22:06) [10]Sergey_Masloff (22.09.04 20:59) [9]
Я на 99% уверен что это кэш кверей который глобальная переменная инициируемая в initialization модуля.
На вскидку Commonib.vQueryList. но у мя тотлько демка, всех исходников нет..
но это так, мелочи.. Вот какой коментарий я нашёл в этом модуле:{---- Please!!!! Dont write in Russian!!! Функция преобразования значения поля типа BLOB в строку ------}
function IBBlobToStr(BlobField : TFIBXSQLVAR) : string;
{---- Функция преобразования типа поля в строку ------}
:-))
← →
Sergey_Masloff (2004-09-22 22:10) [11]jack128 © (22.09.04 22:06) [10]
Нет там модуль отдельный. Дома нет FIBPlus а так не помню. Что глобальная переменная там я видел но не уверен что дело в ней. В смысле не уверен на 1% ;-)
Страницы: 1 вся ветка
Форум: "Потрепаться";
Текущий архив: 2004.10.10;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.034 c