![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Здравствуйте, всем привет.
Делаю неявную загрузку 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);Когда вызываю функцию DLL появляется форма, возвращается значение, все как нужно. Но когда я закрываю основное приложение, то выскакивает access violation, который ссылается на DLL. Я так понимаю, что неправильно освобождаю память.. Господа!! Что делать? Спасибо! Последний раз редактировалось M.A.D.M.A.N., 15.10.2014 в 11:37. |
|
#2
|
||||
|
||||
|
Вообще-то здесь у вас показана статическая, "явная" загрузка, динамика подразумевает использование неразлучной парочки 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
|
|||
|
|||
|
Когда создаёте проект DLL, Delphi в начале пишет длинный комментарий.
Если перед тем, как его стирать, внимательно прочитать и выполнить рекомендации, которые там написаны, то возможно эта ошибка пропадёт. |
| Эти 3 пользователя(ей) сказали Спасибо icWasya за это полезное сообщение: | ||
|
#4
|
|||
|
|||
|
Цитата:
Прочитал. Заменил все параметры на shortstring и все ошибка пропала. Можете рассказать подробнее каких именно параметров это касается? Входных или выходных? |
|
#5
|
||||
|
||||
|
И тех, и тех
Цитата:
|