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

Вниз

Проблема с использованием coFreeUnusedLibrary   Найти похожие ветки 

 
polyakov@asconm.ru   (2006-08-04 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 ©   (2006-08-06 21:35) [1]

> то все будет работать нормально, но только *.ocx никогда
> не выгрузяться, даже если все созданные из них ActiveX формы
> давно убиты...


Странно обычно ActiveX формы убиваються при количестве ссылок на них равным нолю.


 
Паблос ©   (2006-08-07 10:02) [2]

Ну убиываться то они убиваются, а вот ocx из памяти не выгружаются, если не вызывать coFreeUnusedLibrary. Но вот только если вызывать сoFreeUnusedLibrary, то тогда начинаются глюки с созданием ActiveX форм....


 
umbra ©   (2006-08-07 12:57) [3]

я не большой специалист по ActiveX формам, но как написано в справке, сoFreeUnusedLibrary вызывает из длл функцию DllCanUnloadNow, которая ведет себя так:

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


Я не знаю, делает ли так стандартная ActiveX форма делфи. И если Ваши контролы ссылаются на другие ДЛЛ, то в этом может быть все дело.


 
Паблос ©   (2006-08-07 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 создании...


 
Паблос ©   (2006-08-17 11:47) [5]

Итак, я решил эту проблему...
Результат смотрите по ссылке: http://www.developing.ru/forum/viewtopic.php?p=25526#25526



Страницы: 1 вся ветка

Текущий архив: 2009.04.26;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.012 c
3-1219755637
Курдль
2008-08-26 17:00
2009.04.26
Очистить всю таблицу DBF с помощью SQL


15-1234884844
Baks
2009-02-17 18:34
2009.04.26
Рисунки для игры


2-1236591711
Franzy
2009-03-09 12:41
2009.04.26
Указатели и работа с вирт. памятью


2-1237132220
lonely_angel
2009-03-15 18:50
2009.04.26
Точки на карте


15-1235654209
Кто б сомневался
2009-02-26 16:16
2009.04.26
Анабиоз. Сон разума.