-
Всем привет! Пишу на 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 формы давно убиты...
Очень надеюсь на вашу помощь...
-
> то все будет работать нормально, но только *.ocx никогда > не выгрузяться, даже если все созданные из них ActiveX формы > давно убиты...
Странно обычно ActiveX формы убиваються при количестве ссылок на них равным нолю.
-
Ну убиываться то они убиваются, а вот ocx из памяти не выгружаются, если не вызывать coFreeUnusedLibrary. Но вот только если вызывать сoFreeUnusedLibrary, то тогда начинаются глюки с созданием ActiveX форм....
-
я не большой специалист по ActiveX формам, но как написано в справке, сoFreeUnusedLibrary вызывает из длл функцию DllCanUnloadNow , которая ведет себя так: Если ДЛЛ ссылается на другую ДЛЛ, то в случае, когда DllCanUnloadNow вернет S_OK, то будет выгружена и эта вторая ДЛЛ будет выгружена. Чтобы избежать возможного краха программы, ДЛЛ должна вызвать ф-цию CoLoadLibrary(путь_к_другой_ДЛЛ, TRUE), что заставит библиотеку COM перезагрузить вторую ДЛЛ и укажет, что при вызове CoFreeUnusedLibraries последняя должна освобождаться отдельно.
Я не знаю, делает ли так стандартная ActiveX форма делфи. И если Ваши контролы ссылаются на другие ДЛЛ, то в этом может быть все дело.
-
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 создании...
-
|