Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Oшибка выгрузки Dll 
V
    Опции темы
FShadow
Дата 10.4.2008, 00:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 34
Регистрация: 8.12.2006
Где: Беларусь, г. Минс к

Репутация: -1
Всего: -1



Ув. программисты помогите.
Есть такой код динамаческой загрузки dll. Метод загрузки вроде как везде описывают.
Код

procedure TSelectDBForm.FormCreate(Sender: TObject);
var
  ...
  GetListDB: function (aPath: string): TListDBrec; stdcall;
  HandleDll: THandle;

begin
 ...
  HandleDll := LoadLibrary('DLL\auxlib.dll');
  if HandleDll >= 32 then 
    @GetListDB := GetProcAddress(HandleDll, 'GetListDB');

  if Assigned(GetListDB) then
    ListDB1 := GetListDB(pathApp);
...
  FreeLibrary(HandleDll);
end;

При его выполнении происходит ошибка.
Привожу Event Log
Цитата

Module Unload: auxlib.dll. Process DomBuh.exe (1216)
First chance exception at $77423843. Exception class EAccessViolation with message 'Access violation at address 00404CD6 in module 'DomBuh.exe'. Read of address 04B4C7C8'. Process DomBuh.exe (1216)


Я так понимаю dll выгрузилась успешно тогда в чем проблема?
Если dll грузится статически то ошибки нет и все работает нормально.
Помогите разобраться в чем ошибка?
PM MAIL   Вверх
Alexeis
Дата 10.4.2008, 09:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Цитата(FShadow @  9.4.2008,  23:35 Найти цитируемый пост)
Я так понимаю dll выгрузилась успешно тогда в чем проблема?

  Скорее всего неправильная работа с памятью в Dll, AV это крах программы. Вариантов может быть много, самый вероятный, то что при передаче данных использовалась память выделенная в куче, но у Dll и программы разные менеджеры памяти.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
DragonFire
Дата 10.4.2008, 10:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 14.8.2005
Где: Москва

Репутация: нет
Всего: 9



Есть подозрение на проблему с функцией... Насколько я понял из когда, ты получаешь адрес на функцию из ДЛЛ, потом его используешь, а потом очищаешь ДЛЛ хандл... МОжет попробовать чтото проде GetListDB:=nil; перед FreeLibrary... 


--------------------
PM MAIL ICQ   Вверх
FShadow
Дата 10.4.2008, 13:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 34
Регистрация: 8.12.2006
Где: Беларусь, г. Минс к

Репутация: -1
Всего: -1



Цитата

Скорее всего неправильная работа с памятью в Dll, AV это крах программы. Вариантов может быть много, самый вероятный, то что при передаче данных использовалась память выделенная в куче, но у Dll и программы разные менеджеры памяти.


Так и есть. Я так понял что результат операции ListDB1 := GetListDB(pathApp); находится в адресном пространстве dll
а после FreeLibrary в переменной ListDB1 все значения обнуляются.  Отсюда вопрос: Как изменить код чтоб этого не происходило.

Для справки TListDBrec это запись может это важно.
PM MAIL   Вверх
Alexeis
Дата 10.4.2008, 14:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Цитата(FShadow @  10.4.2008,  12:06 Найти цитируемый пост)
Так и есть. Я так понял что результат операции ListDB1 := GetListDB(pathApp); находится в адресном пространстве dll
а после FreeLibrary в переменной ListDB1 все значения обнуляются.  Отсюда вопрос: Как изменить код чтоб этого не происходило.


Есть модуль FastShareMem это не родной, но зато не требует сторонней Dll. Его нужно прописать 1м в проге и Dll тогда при выделении памяти в Dll он будет выделяться в менеджере кучи программы.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
DragonFire
Дата 10.4.2008, 15:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 14.8.2005
Где: Москва

Репутация: нет
Всего: 9



Цитата(FShadow @  10.4.2008,  13:06 Найти цитируемый пост)
Так и есть. Я так понял что результат операции ListDB1 := GetListDB(pathApp); находится в адресном пространстве dll
а после FreeLibrary в переменной ListDB1 все значения обнуляются.  Отсюда вопрос: Как изменить код чтоб этого не происходило.

Поидее если у тебя ListDB1  объявлена тут же (а не в ДЛЛ) то никакие значения обнулятся не должны. А вот обнулять указатель на функцию перед FreeLibrary нужно.


--------------------
PM MAIL ICQ   Вверх
FShadow
Дата 10.4.2008, 17:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 34
Регистрация: 8.12.2006
Где: Беларусь, г. Минс к

Репутация: -1
Всего: -1



Цитата

Есть модуль FastShareMem это не родной, но зато не требует сторонней Dll. Его нужно прописать 1м в проге и Dll тогда при выделении памяти в Dll он будет выделяться в менеджере кучи программы.

Спасибо за модуль FastShareMem. Помог.

Только надо освободить библиотеку до использования ListDB1. Если после то возникают проблемы. Присвоенное значение заполняется непонятно чем или обнуляется. 
Код

  FreeLibrary(HandleDll);
  
  if ListDB1.FCount > 0 then
   for i := 0 to ListDB1.FCount - 1 do
    lvFiles.Items.Add.Caption := ListDB1.FName[i];
 

Цитата

Поидее если у тебя ListDB1  объявлена тут же (а не в ДЛЛ) то никакие значения обнулятся не должны. А вот обнулять указатель на функцию перед FreeLibrary нужно.

Тип объявлен тут же, но честно сказать никаких изменений после добавления строки GetListDB:=nil; не наблюдал.

 
Спасибо всем за помощь!
PM MAIL   Вверх
Alexeis
Дата 11.4.2008, 08:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Цитата(FShadow @  10.4.2008,  16:23 Найти цитируемый пост)
Только надо освободить библиотеку до использования ListDB1. Если после то возникают проблемы. Присвоенное значение заполняется непонятно чем или обнуляется. 

  Важно, чтобы не было обращения к функциям Dll после ее удаления. Кроме того данные может уничтожить владелец. Могло получиться так что владельцем был объект из Dll, который автоматически уничтожается по выходу и уничтожает своих детей. Например Application/mouse/Screen и т.д.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0509 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.