Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 15.10.2014, 10:16
delphi_begin delphi_begin вне форума
Прохожий
 
Регистрация: 23.09.2011
Сообщения: 22
Репутация: 10
По умолчанию Неявная загрузка DLL. Освобождение памяти

Здравствуйте, всем привет.

Делаю неявную загрузку DLL с функцией, которая принимает параметры и возвращает значение, а также отображаем форму.

Вот сама процедура DLL

Код:
Function ShowForm(user_id:string;for_select:boolean):integer; export; stdcall;
  begin
  dm:=Tdm.Create(nil);
  form3:=tform3.Create(nil);
  ads_list.user_id:=user_id;
  if for_select then form3.BitBtn2.Visible:=true;
    FORM3.ShowModal;
 result:=DM.IBDS_AIDS.fieldbyname('id').AsInteger;
freeandnil(form3);
freeandnil(dm);

end;

Вот вызов из приложения:

//объявление
Function ShowForm(user_id:string;for_select:boolean):integer; stdcall; external 'Aids.dll';

//вызов
i:=ShowForm(cur_usr.USER_ID,true);
MAD: Теги.

Когда вызываю функцию DLL появляется форма, возвращается значение, все как нужно. Но когда я закрываю основное приложение, то выскакивает access violation, который ссылается на DLL. Я так понимаю, что неправильно освобождаю память..
Господа!! Что делать?
Спасибо!

Последний раз редактировалось M.A.D.M.A.N., 15.10.2014 в 11:37.
Ответить с цитированием
  #2  
Старый 15.10.2014, 11:35
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Вообще-то здесь у вас показана статическая, "явная" загрузка, динамика подразумевает использование неразлучной парочки loadLibrary-FreeLibrary плюс промежуточной getProcAddress для поиска вызываемого кода. Статика уничтожается автоматом менеджером памяти при выходе, но видимо, этого не происходит, в смысле счетчик обращений к библиотеке не нулевой, попробуйте для проверки при завершении выполнить такое(drkb: 01995)
Код:
function KillDll(aDllName: string): Boolean;
var
hDLL: THandle;
aName: array[0..10] of char;
FoundDLL: Boolean;
begin
StrPCopy(aName, aDllName);
FoundDLL := False;
repeat
   hDLL := GetModuleHandle(aName);
   if hDLL = 0 then
     Break;
   FoundDLL := True;
   FreeLibrary(hDLL);
until False;
if FoundDLL then
   MessageDlg('Success!', mtInformation, [mbOK], 0)
else
   MessageDlg('DLL not found!', mtInformation, [mbOK], 0);
end;
Ответить с цитированием
  #3  
Старый 15.10.2014, 12:29
icWasya icWasya вне форума
Местный
 
Регистрация: 09.11.2010
Сообщения: 499
Репутация: 10
По умолчанию

Когда создаёте проект DLL, Delphi в начале пишет длинный комментарий.
Если перед тем, как его стирать, внимательно прочитать и выполнить рекомендации, которые там написаны, то возможно эта ошибка пропадёт.
Ответить с цитированием
Эти 3 пользователя(ей) сказали Спасибо icWasya за это полезное сообщение:
Aristarh Dark (15.10.2014), delphi_begin (15.10.2014), Freeman (15.10.2014)
  #4  
Старый 15.10.2014, 13:06
delphi_begin delphi_begin вне форума
Прохожий
 
Регистрация: 23.09.2011
Сообщения: 22
Репутация: 10
По умолчанию

Цитата:
Сообщение от icWasya
Когда создаёте проект DLL, Delphi в начале пишет длинный комментарий.
Если перед тем, как его стирать, внимательно прочитать и выполнить рекомендации, которые там написаны, то возможно эта ошибка пропадёт.


Прочитал. Заменил все параметры на shortstring и все ошибка пропала. Можете рассказать подробнее каких именно параметров это касается? Входных или выходных?
Ответить с цитированием
  #5  
Старый 15.10.2014, 13:15
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

И тех, и тех
Цитата:
...Если динамическая библиотека в процессе работы использует переменные или функции, осуществляющие динамическое выделение памяти под собственные нужды (длинные строки, динамические массивы, функции New и GetMem), а также, если такие переменные передаются в параметрах и возвращаются в результатах, то в таких библиотеках обязательно должен использоваться модуль ShareMem. При этом в секции uses модуль должен располагаться на первом месте. Об этом напоминает комментарий, автоматически добавляемый в файл динамической библиотеки при создании

Управление этими операциями осуществляет специальный диспетчер печати BORLANDMM.DLL. Он должен распространяться вместе с динамическими библиотеками, использующими модуль ShareMem
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 00:38.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025