Конференция "Основная" » TIBataBase и DLL [D7, WinXP]
 
  • Maxick © (13.03.08 08:55) [0]
    Проблема следующего характера: Передовая в ДЛЛ данный объект и поимел проблему: при завершении приложения в главной форме не могу фрикнуть (DB.Free) объект DB=TIBDataBase. Вызывается исключение: Ошибка опирации с указателем. Соответственно, если мне не всвобождать DB (я ее создаю сам), то исключение: "приложение ххх.exe обратилось к адрессу хххх" и т.д.
    Собственно вопрос: с чем это связано и как с тим бороться? Варианты типа "обработай сам это исключение" не хотелось бы слюшать.
  • IntruderLab (13.03.08 09:05) [1]
    как вариант используй CoInitialize() и CoUnInicialize(), ShareMem прописаны в главной форме и в dll
  • Maxick © (13.03.08 10:15) [2]
    IntruderLab, Можно будет и попробовать. Я так понимаю, при передачи объекта (указателя) в длл и происходитв вся эта бодяга. В длл у меня форма и работа с базой (таблицы и т.п.). Форма вызывается модально и после высвобождается, но хвост от TIBDataBase остается. Причем, это единственный обект с такой траблой на моей памяти.
    Текст в длл:

    function xxx(app:TApplication; db: TIBDataBase): boolean; stdcall;
    var
     hdll: TApplication;
    begin
     hdll:= application;
     application:= app;
     DataBase:= db;  
     fmForm:= TfmForm.Create(Application);
     fmForm.ShowModal;
     fmForm.Free;
     application:= hdll;



    Соответственно вызов:

    ...
    DB.Create(self);
    ...
    //тут динамическая загрузка длл
    ...
    xxx(Application,db);
    ...
    //и в событии OnClose главной формы
    db.free;


    Весь фокус еще в том, что если фрикать в процедуре (OnCreate главной формы), где создавалась db (там же и функцию из длл вызывать) то нет проблем совсем.
  • Maxick © (13.03.08 10:17) [3]
    забыл добавить, что при динамической загрузке длл также используется соглашение stdcall.
  • Сергей М. © (13.03.08 10:24) [4]
  • Сергей М. © (13.03.08 10:37) [5]

    > и в событии OnClose главной формы
    > db.free;


    Разве это логично ?

    Уж если объект создан тобой сразу после конструирования формы (OnCreate), то и уничтожать его, очевидно, следует непосредственно перед разрушением этой формы (OnDestroy).


    > DB.Create(self);


    А это что еще за фигня ?
    Разве DB у тебя объявлен как TComponentClass ?
  • Maxick © (13.03.08 11:03) [6]

    > Сергей М. ©   (13.03.08 10:37) [5]


    Я так понял, вы про это:
    "1. В исх.кодах своих exe- и dll-проектов убираешь все касаемое параметра Appl, т.е. передача этого параметра не нужна вообще.

    2. Во всех своих проектах устанавливаешь крыжик
    Project->Options..->Packages->Build With Run-Time Packages
    и после этого полностью ребилдишь эти проекты.

    Все !! Больше никаких телодвижений делать не нужно."
    Прав?
    А про Крейт - дошло :). А про дестрой - пробовал - неканает.
  • Сергей М. © (13.03.08 11:05) [7]

    > Прав?


    Да.


    > про дестрой - пробовал - неканает


    Это же не редиска, чтобы "канать")
  • Maxick © (13.03.08 11:09) [8]
    Ладно, сейчас исходников рядом нет (нахожусь в другом месте, долеко от того компа, где все это делается), попробую - отпишусь.
  • Maxick © (13.03.08 11:17) [9]

    > Сергей М. ©

    Но всеравно не совсем въезжаю - я передаю в длл Application а не ее Handle, т.е. длл полностью привязываю к смоему аплу... Т.о., как здесь: "У твоей dll св-во MainForm объекта Application равно nil.
    Удивись, почеши репу, сделай выводы)" - не соответствует моему случаю. И с чаилдами у меня проблем никогда небыло... уже давно все в длл спихиваю, ну нравится мне так - легче в отладке больших проектов, а также в абгрейдах (патчах) у клиентов.
    Или я что-то не допонимаю? ;)
  • Сергей М. © (13.03.08 11:33) [10]

    > Или я что-то не допонимаю?


    Именно.

    Выполнение указанных в [4] рекомендаций приведет к тому, что у всех взаимодействующих модулей в составе приложения будут едиными (общими) объекты Application и Screen (и еще много чего).

    Суть проста - сборка всех взаимодействующих проектов с упомянутой опцией ведет к использованию ими одного и того же экз-ра пакета vclxx.bpl (и, самое главное, пакета rtlxx.bpl), в котором "живут" такие (весьма важные в дан.случае) глобальные объекты как Application и Screen.
  • Maxick © (13.03.08 12:16) [11]
    Суть понял. Но если, ради интереса, попробовать передавать в DLL помимо Application еще и Screen? Каков будет результат в моем случае? (незнаю почему, точнее не помню, но Screen я довно перестал передавать в ДЛЛ - видимо неувидел в этом нужды... года 3 тому назад было...)
  • Сергей М. © (13.03.08 12:24) [12]

    > еще и Screen? Каков будет результат в моем случае?


    Screen не имеет к твоей проблеме никакого отношения.
  • Maxick © (13.03.08 12:36) [13]
    Значит получается проблема именно в экземплярах (копиях) в памяти процесов. Извините за мою докапываемость, но я хочу понять именно причину. Т.о. смогу не допускать подобных ситуаций в своих прогах. Да и поняв причину - метод решения проблемы становится очевидным.
  • Сергей М. © (13.03.08 13:05) [14]

    > проблема именно в экземплярах (копиях) в памяти процесов


    Ну говоря упрощенно - да.
  • Maxick © (13.03.08 13:26) [15]
    и решение, получается, только одно - исключить размножения экземпляров Application (даже передовая и присваивая Application в ДЛЛ он есть свой). Предлагаемый Вами метод, при создании экземпляра ДЛЛ экзешником не создает отдельный Апл а присваевает ему от ехе, чем исключаются все подобные проблемы. И это единственный выход из данной ситуации. Я все правильно понял? Спасибо вам за помощь. Буду пробовать, в случае неудачи напишу.
  • Maxick © (13.03.08 19:04) [16]

    > Сергей М. ©

    Большое спасибо еще раз, все чудесно заработало без ошибок... пока... дальше посмотрим ;)
  • Maxick © (13.03.08 19:45) [17]

    > Сергей М. ©

    НЕ все протестив дал я предыдущий ответ!
    Оно заработало,т.е. там где были траблы (не меняя код) ушли. Убирая в ДЛЛ аппликашион настает кирдык функции (приложение хххх обратилось по адресу 000000 к.... 00000), при попытке фрикаль "DB" (перенЁс в Он Дестрой) таже бадяжка (приложение ххх обратилось по адресу 00000...). И самое прикольное, можно не фрикать и тогда все функции работают (без убирания в длл апла), но там где (в [2] последняя строка) все чудненько работало - перестало напрочь... пока еще я не проверял/выяснял/эксперементировал - но результат не совсем тот, к которому я готовился. тоесть, при убирании в длл апла (Application, т.е его передачу в ДЛЛ) - DLL не понимает крейта формы...
  • Игорь Шевченко © (13.03.08 23:29) [18]

    > при убирании в длл апла (Application, т.е его передачу в
    > ДЛЛ) - DLL не понимает крейта формы...


    Сам понял чего написал - дай другим понять.
  • Германн © (14.03.08 00:40) [19]

    > Сам понял чего написал - дай другим понять.
    >

    При таком французском ("аппликашион настает кирдык", "при попытке фрикаль "DB"", "таже бадяжка", "можно не фрикать", "без убирания в длл апла")  лучше не надо. Не дай бог мозги расплавятся при попытке понять.
 
Конференция "Основная" » TIBataBase и DLL [D7, WinXP]
Есть новые Нет новых   [134484   +45][b:0][p:0.001]