| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Общие вопросы > Oшибка выгрузки Dll |
| Автор: FShadow 10.4.2008, 00:35 | ||||
| Ув. программисты помогите. Есть такой код динамаческой загрузки dll. Метод загрузки вроде как везде описывают.
При его выполнении происходит ошибка. Привожу Event Log
Я так понимаю dll выгрузилась успешно тогда в чем проблема? Если dll грузится статически то ошибки нет и все работает нормально. Помогите разобраться в чем ошибка? |
| Автор: Alexeis 10.4.2008, 09:31 |
Скорее всего неправильная работа с памятью в Dll, AV это крах программы. Вариантов может быть много, самый вероятный, то что при передаче данных использовалась память выделенная в куче, но у Dll и программы разные менеджеры памяти. |
| Автор: DragonFire 10.4.2008, 10:31 |
| Есть подозрение на проблему с функцией... Насколько я понял из когда, ты получаешь адрес на функцию из ДЛЛ, потом его используешь, а потом очищаешь ДЛЛ хандл... МОжет попробовать чтото проде GetListDB:=nil; перед FreeLibrary... |
| Автор: FShadow 10.4.2008, 13:06 | ||
Так и есть. Я так понял что результат операции ListDB1 := GetListDB(pathApp); находится в адресном пространстве dll а после FreeLibrary в переменной ListDB1 все значения обнуляются. Отсюда вопрос: Как изменить код чтоб этого не происходило. Для справки TListDBrec это запись может это важно. |
| Автор: DragonFire 10.4.2008, 15:34 | ||
Поидее если у тебя ListDB1 объявлена тут же (а не в ДЛЛ) то никакие значения обнулятся не должны. А вот обнулять указатель на функцию перед FreeLibrary нужно. |
| Автор: FShadow 10.4.2008, 17:23 | ||||||
Спасибо за модуль FastShareMem. Помог. Только надо освободить библиотеку до использования ListDB1. Если после то возникают проблемы. Присвоенное значение заполняется непонятно чем или обнуляется.
Тип объявлен тут же, но честно сказать никаких изменений после добавления строки GetListDB:=nil; не наблюдал. Спасибо всем за помощь! |
| Автор: Alexeis 11.4.2008, 08:59 | ||
Важно, чтобы не было обращения к функциям Dll после ее удаления. Кроме того данные может уничтожить владелец. Могло получиться так что владельцем был объект из Dll, который автоматически уничтожается по выходу и уничтожает своих детей. Например Application/mouse/Screen и т.д. |