Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.04.2014, 16:02   #1
5cek
Форумчанин
 
Регистрация: 04.07.2013
Сообщений: 118
Вопрос Злосчастное dll

Вообщем прошу помощи, уже весь гугл затёр, не могу не как справится, есть dll с парой форм и одним DataModule, по сути эта dll работает с БД, одна из форм при открытии показывает список строк при выборе возвращает основной проге ID записи, с этим всё ок, форма работает ровно, так же попытавшись засунуть в dll вторую форму, некий редактор строк, столкнулся с проблемой, форма открывается всё редактируется, но при освобождении библеотеки FreeLibrary прога виснет намертво. При этом, есть ещё одна библиотека так же с формами, там другая проблемма, форма открывается, закрывается и библиотека вроде бы освобождается, второй раз вызываю форму, уже не подсвечивается крестик у окна при наведении, но закрывается тоже, третий раз вызываю окно и при закрытии так же прога виснет намертво. ShareMem подключен, строки в функциях не возвращаю. Код чего угодно предоставлю.
5cek вне форума Ответить с цитированием
Старый 15.04.2014, 16:21   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
при освобождении библеотеки FreeLibrary прога виснет намертво.
Формы в ДЛЛ просто закрываются или именно освобождаются?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 15.04.2014, 16:26   #3
5cek
Форумчанин
 
Регистрация: 04.07.2013
Сообщений: 118
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Формы в ДЛЛ просто закрываются или именно освобождаются?
Освобождаются по закрытию, пробовал несколькими способоами:
1. Загружается библиотека, вызывается процедура:
Код:
procedure ShowClassForm; stdcall;
begin
  if ClassForm = nil then
  begin
    ClassForm := TClassForm.Create(nil);
    ClassForm.ShowModal;
  end;
end;
В обработчике OnClose у формы стоит Action := caFree
Естественно модальная форма закрывается и дальше в приложении наступает шаг FreeLibrary. - Приложение зависло.
2. Загружается библиотека, вызывается процедура:
Код:
procedure ShowClassForm; stdcall;
begin
  if ClassForm = nil then
  begin
    ClassForm := TClassForm.Create(nil);
    ClassForm.ShowModal;
    FreeAndNil(ClassForm);
  end;
end;
То есть после закрытия формы, она обнуляется и освобождается, дальше в приложении наступает шаг FreeLibrary. - Приложение зависло.
5cek вне форума Ответить с цитированием
Старый 15.04.2014, 16:28   #4
5cek
Форумчанин
 
Регистрация: 04.07.2013
Сообщений: 118
По умолчанию

Кстати говоря если убрать FreeLibrary то ошибки нет, то приложение не виснет, а при закртытии приложения вылетает Runtime Error
5cek вне форума Ответить с цитированием
Старый 15.04.2014, 16:45   #5
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
ShowModal и Action := caFree
Модальные формы закрывают например так: ModalResult:=mrOk в обработчике кнопки выхода и
Код:
 ClassForm := TClassForm.Create(nil);
 ClassForm.ShowModal;
 ClassForm.Free;
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 15.04.2014 в 16:47.
Аватар вне форума Ответить с цитированием
Старый 15.04.2014, 16:54   #6
5cek
Форумчанин
 
Регистрация: 04.07.2013
Сообщений: 118
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Модальные формы закрывают например так: ModalResult:=mrOk в обработчике кнопки выхода и
Код:
 ClassForm := TClassForm.Create(nil);
 ClassForm.ShowModal;
 ClassForm.Free;
Не люблю сильно спорить, по этому сделал по вашему, всё равно повисло приложение. Чёт не то короче)
5cek вне форума Ответить с цитированием
Старый 15.04.2014, 16:56   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Аватар
FreeAndNil(ClassForm); сделает то же самое что и Free.
Не, там ошибка в другом. Не зря Борланд сделал BPL для работы с формами в динамических библиотеках против стандартных DLL.
Чесслово не помню в чем глюки, просто многие не рекомендую в ДЛЛках формы VCL крутить.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 15.04.2014, 17:01   #8
5cek
Форумчанин
 
Регистрация: 04.07.2013
Сообщений: 118
По умолчанию

Блин я уже не знаю, может я не так гружу?
Код:
procedure TForm2.ExecLibararyProcedure(ProcName, LibName: String);
Var
  dHandle: THandle;
  Proc: procedure; stdcall;
begin
  @Proc := nil;
  dHandle := LoadLibrary(PChar(LibName));
  if dHandle <> 0 then
  begin
    @Proc := GetProcAddress(dHandle, PChar(ProcName));
    if @Proc <> nil then
    begin
      Proc;
    end
    else
    begin
      MessageBox(handle, PChar('Процедура ' + ProcName +
        ' не найдена в ' + LibName), 'Ошибка', MB_ICONERROR);
      Exit;
    end;
    FreeLibrary(dHandle);
  end
  else
  begin
    MessageBox(handle, PChar('Библиотека ' + LibName +
      ' не может быть загружена.'), 'Ошибка', MB_ICONERROR);
    Exit;
  end;
end;
5cek вне форума Ответить с цитированием
Старый 15.04.2014, 17:05   #9
5cek
Форумчанин
 
Регистрация: 04.07.2013
Сообщений: 118
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
FreeAndNil(ClassForm); сделает то же самое что и Free.
Не, там ошибка в другом. Не зря Борланд сделал BPL для работы с формами в динамических библиотеках против стандартных DLL.
Чесслово не помню в чем глюки, просто многие не рекомендую в ДЛЛках формы VCL крутить.
Да с BPL у меня честно говоря жопотёрка вышла, так и не смог я скомпилить проэкт с ними, то одно то другое, компонентов в проэкте море, с одним из них от которого я не мог отказаться и вышла проблема, потом с фаст репортом, короч не то. Да и кажется мне dll это не так уж и страшно, используют же люди как то, и живут их приложения, только остался главный вопрос... КАК?
5cek вне форума Ответить с цитированием
Старый 15.04.2014, 17:24   #10
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,543
По умолчанию

DLL а также Exe это не только твой код (твои формы) но и куча другого
Application, Screen, Mouse (навскидку)
и DLL.Аpplication<>Exe.Application
и DLL не имеет кода аналогичного Application.Run
и BPL не предлагать.

Цитата:
Да и кажется мне dll это не так уж и страшно, используют же люди как то, и живут их приложения, только остался главный вопрос... КАК?
например
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 15.04.2014 в 17:28.
evg_m вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

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

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Инструкция для сборки приложений на Qt в один exe без зависимостей от libstdc++-6.dll, libgcc_s_dw2-1.dll, Qt5Core.dll и т.д. 8Observer8 Qt и кроссплатформенное программирование С/С++ 12 25.06.2015 03:18
C# & DLL: как указать, что загружать DLL нужно из ЗАДАННОЙ папки "D:\My\Path\a.dll" ? AntyDES C# (си шарп) 11 10.10.2012 20:00
Debugger Kernel BORDBK160.DLL or BORDBK160N.DLL is missing or not registered. Человек_Борща Общие вопросы Delphi 0 15.07.2012 14:01
Ошибка при выхове функций Bass.dll из другой DLL SalasAndriy Общие вопросы Delphi 7 21.10.2009 23:36