Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.10.10;
Скачать: CL | DM;

Вниз

Передать 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]
вот - вот. Я сейчас посмотрел код IBX

procedure 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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.039 c
1-1095742277
Gero
2004-09-21 08:51
2004.10.10
Рисование на рамке закладки TTabControl


1-1096286189
Mar_Gel
2004-09-27 15:56
2004.10.10
Подскажите, как поменять иконку в программе во время выполнения?


4-1093870145
wal
2004-08-30 16:49
2004.10.10
Стандартные ресурсы


3-1094885277
sloug
2004-09-11 10:47
2004.10.10
Дополнительное поле и работа с ним


14-1095777403
}|{yk
2004-09-21 18:36
2004.10.10
Не надо пожалуйста любых обвинений