Конференция "Corba" » Проблема с использованием coFreeUnusedLibrary [Delphi, Windows]
 
  • polyakov@asconm.ru (04.08.06 10:28) [0]
    Всем привет!
    Пишу на Delphi 6, столкнулся с непонятной проблемой, бьюсь уже бог знает сколько времени, уже незнаю даже где копать... может кто чего подскажет?
    итак проблема:
    Если создать такое тестовое приложение

    MainFrom->ChildForm->ActiveXForm1->ActiveXForm2->ActiveXForm3
                                   ChildAX1.ocx     ChildAX2.ocx    ChildAX3.ocx

    где каждая ActiveX форма находиться в своем *.ocx, а на событие Application.OnIdle вызывать coFreeUnusedLibrary, то после 6-10 раз выполнения следующей последовательности: создать ChildForm, отобразить, закрыть ChildForm, освободить *.ocx с помощью coFreeUnusedLibrary, то происходит Access Violation в модуле ChildsAX2.ocx. Ошибка происходит в TActiveXControl.Initialize, т.е. при создании ActiveX формы из ChildAX2.ocx. Если же убрать вызов coFreeUnusedLibrary, то все будет работать нормально, но только *.ocx никогда не выгрузяться, даже если все созданные из них ActiveX формы давно убиты...

    Очень надеюсь на вашу помощь...
  • tesseract © (06.08.06 21:35) [1]
    > то все будет работать нормально, но только *.ocx никогда
    > не выгрузяться, даже если все созданные из них ActiveX формы
    > давно убиты...


    Странно обычно ActiveX формы убиваються при количестве ссылок на них равным нолю.
  • Паблос © (07.08.06 10:02) [2]
    Ну убиываться то они убиваются, а вот ocx из памяти не выгружаются, если не вызывать coFreeUnusedLibrary. Но вот только если вызывать сoFreeUnusedLibrary, то тогда начинаются глюки с созданием ActiveX форм....
  • umbra © (07.08.06 12:57) [3]
    я не большой специалист по ActiveX формам, но как написано в справке,
    сoFreeUnusedLibrary

    вызывает из длл функцию
    DllCanUnloadNow

    , которая ведет себя так:

    Если ДЛЛ ссылается на другую ДЛЛ, то в случае, когда DllCanUnloadNow вернет S_OK, то будет выгружена и эта вторая ДЛЛ будет выгружена. Чтобы избежать возможного краха программы, ДЛЛ должна вызвать ф-цию CoLoadLibrary(путь_к_другой_ДЛЛ, TRUE), что заставит библиотеку COM перезагрузить вторую ДЛЛ и укажет, что при вызове CoFreeUnusedLibraries последняя должна освобождаться отдельно.



    Я не знаю, делает ли так стандартная ActiveX форма делфи. И если Ваши контролы ссылаются на другие ДЛЛ, то в этом может быть все дело.
  • Паблос © (07.08.06 14:27) [4]
    ActiveX формы ссылаются на другие формы, а именно ActiveXForm1 создает ActiveXForm2 из ChildAX2.ocx, а ActiveXForm2 создает ActiveXForm2 из ChildAX3.ocx.... но в хелпе также написано что CoLoadLibrary вызывать не надо, т.к. она вызывыется внутри coCreateInstance которая как раз вызываться при создании ActiveX формы.
    Впринципе в EventLog я наблюдаю правильную картину, т.е. при создании ChildForm я вижу что были поочередно загружены библиотеки, а при закрытии поочердно в обратном порядке выгружены...
    Module Load: ChildAX1
    Module Load: ChildAX2
    Module Load: ChildAX3
    Module Unload: ChildAX3
    Module Unload: ChildAX2
    Module Unload: ChildAX1

    но именно почему то на 11 создании ChildForm я наблюдаю:
    Module Load: ChildAX1
    Module Load: ChildAX2
    и Access Violation в ChildAX2
    насколько мне удалось определить, то ошибка возникала в ChildAX2.ocx на CreateInstanceLic. Но я хоть убей не понимаю почему 10 раз все создавалось и выгружалось нормально а на 11 раз такой глюк появляется... и ведь ошибка то не плавающая, т.е. стабильно валиться на 11 создании...
  • Паблос © (17.08.06 11:47) [5]
    Итак, я решил эту проблему...
    Результат смотрите по ссылке: http://www.developing.ru/forum/viewtopic.php?p=25526#25526
 
Конференция "Corba" » Проблема с использованием coFreeUnusedLibrary [Delphi, Windows]
Есть новые Нет новых   [134431   +9][b:0][p:0.001]