SQLRU.net
Разработка приложений баз данных

Начало » Программирование » Delphi » Использование форм в DLL (Корректный вызов формы и освобождение памяти при закрытии)
Использование форм в DLL [сообщение #3189] Wed, 27 September 2023 17:00 Переход к следующему сообщению
LeGO в настоящее время не в онлайне  LeGO
Сообщений: 4
Зарегистрирован: September 2023
Junior Member
Всем привет, не ругайтесь, но мы используем формы в dll  :d .
В общем и целом момент такой:
Разрабатываем приложение MDI, дочерние окна(модули) которой содержаться в dll. При нажатии кнопки меню в главном окне соответственно вызывается нужный модуль с формой. Обновление этих dll (если что-то в проекте поменяли), происходит в момент запуска программы (сравниваются версии dll на пользовательском ПК и сервере и, если есть различие, заменяются более свежими). Стоит задача проверять наличие более новой версии dll не только при запуске программы, но и в момент ее работы, при вызове этой dll по нажатию кнопки в меню. Сделали, но есть момент: обновление проходит нормально только если dll с формой до этого ни разу не вызывалась в рамках текущего запуска основной формы. Если же dll хоть раз вызвали, при замене файла - ошибка 5 "Отказано в доступе". В ручную тоже не дает удалять - "Файл занят основным приложением".
Накидал тестовый проект с вызовом dll. В самой dll - Форма пустая и одна экспортируемая функция(просто возвращает рандомное число). В основном проекте две кнопки, одна вызывает функцию из этой dll, вторая показывает из нее же форму. Ок, запускаем: при вызове просто функции (программу не закрываем), она отрабатывает, и есть возможность dll удалить вручную. При нажатии на вторую кнопку показываем форму из dll, закрываем ее, и... не можем удалить файл dll. Занят. Чем, не понятно. Freelibrary, CloseHandle, TerminateProcess не помогают. Может кто сталкивался с таким? Что может держать dll и как с этим бороться?

С уважением, LeGO   
Re: Использование форм в DLL [сообщение #3195 является ответом на сообщение #3189] Thu, 28 September 2023 12:36 Переход к предыдущему сообщениюПереход к следующему сообщению
МП в настоящее время в онлайне  МП
Сообщений: 887
Зарегистрирован: August 2022
Географическое положение: бурятский тун...
Senior Member
Монитор ресурсов (resmon), вкладка ЦП, Связанные дескрипторы.
Re: Использование форм в DLL [сообщение #3196 является ответом на сообщение #3189] Thu, 28 September 2023 14:15 Переход к предыдущему сообщениюПереход к следующему сообщению
LeGO в настоящее время не в онлайне  LeGO
Сообщений: 4
Зарегистрирован: September 2023
Junior Member
В мониторе ресурсов не видно ничего такого криминального, ну или я не понимаю может чего-то в нем)

Кому интересно попробовать вот исходники
Код основного приложения:
Показать скрытый текст
Код dll:
Показать скрытый текст
Код формы в dll:
Показать скрытый текст

[Обновления: Thu, 28 September 2023 17:13]

Известить модератора

Re: Использование форм в DLL [сообщение #3216 является ответом на сообщение #3196] Fri, 29 September 2023 20:39 Переход к предыдущему сообщениюПереход к следующему сообщению
shalamyansky в настоящее время не в онлайне  shalamyansky
Сообщений: 150
Зарегистрирован: August 2022
Senior Member
Вы в одном процессе запускаете 2 фреймворка VCL? Сильно. Да что там в одном процессе - в одном потоке! В одном потоке у вас 2 объекта Application, два главных окна, и главное - 2 цикла обработки сообщений. Даже представить трудно, к какую восьмерку или спираль превращаются эти циклы.

Скорее всего, происходит вот что. Внутреннее VCL-приложение, вызванное из dll, никто не закрывает и даже не делает попытки закрыть. WM_QUIT перехватывается внешним приложением, а внутренний цикл так и продолжает крутиться, точнее, ждать у моря погоды. Невзирая ни на какие FreeLibrary, библиотека вряд ли выгрузится, пока точка исполнения находится у нее внутри. А если вдруг и выгрузится, это должно привести к фатальной ошибке.

Дополнительный PostQuitMessage предположительно может помочь решить конкретно эту ситуацию, но другие ожидаемые в количестве проблемы на такой кривой козе не объедешь.
Re: Использование форм в DLL [сообщение #3217 является ответом на сообщение #3216] Fri, 29 September 2023 20:48 Переход к предыдущему сообщениюПереход к следующему сообщению
shalamyansky в настоящее время не в онлайне  shalamyansky
Сообщений: 150
Зарегистрирован: August 2022
Senior Member
Для совместного использования памяти и классов вроде как придумали bpl, почему не используете? Советовать не могу, сам никогда с ними не работал.

А если переходить к советам - надежнее и проще во всех смыслах писать отдельные приложения, прописывая только протокол их взаимодействия. Если приложения работают на уровне оконного интерфейса, как у вас, то это делается не просто, а очень просто.

[Обновления: Fri, 29 September 2023 20:51]

Известить модератора

Re: Использование форм в DLL [сообщение #3218 является ответом на сообщение #3217] Fri, 29 September 2023 21:24 Переход к предыдущему сообщениюПереход к следующему сообщению
shalamyansky в настоящее время не в онлайне  shalamyansky
Сообщений: 150
Зарегистрирован: August 2022
Senior Member
Посмотрел чуть внимательней на ваш код. Беру часть своих слов обратно. Объекта Application (который сам по себе и является главным окном приложения в смысле Windows) действительно 2, но цикл запущен только один, нигде нет запуска Application.Run. Что там при этом происходит с обработкой сообщений для внутренних окон, трудно предугадать. Но причина невыгрузки, скорее всего, именно указанная - точка кода исполнения одного из потоков находится в кодовом сегменте выгружаемой dll.
Re: Использование форм в DLL [сообщение #3222 является ответом на сообщение #3218] Sun, 01 October 2023 14:10 Переход к предыдущему сообщениюПереход к следующему сообщению
SD в настоящее время не в онлайне  SD
Сообщений: 411
Зарегистрирован: August 2022
Senior Member
Вызывать DLLMain руками из DLLMain это сильный ход.

Типичное незнание, что эта функция вызывается под глобальным системным локом и любое неосторожное движение в ней приводит к деду локу.
Re: Использование форм в DLL [сообщение #3235 является ответом на сообщение #3222] Mon, 02 October 2023 22:11 Переход к предыдущему сообщениюПереход к следующему сообщению
Taнцop Пacaдoбля в настоящее время не в онлайне  Taнцop Пacaдoбля
Сообщений: 5
Зарегистрирован: August 2023
Junior Member
Вырезал madExcept из uses, собрал пример, у меня dll без вопросов освобождается,
но не понятно почему в примере вызов ShowModal, а где же MDI приложение?
Re: Использование форм в DLL [сообщение #3295 является ответом на сообщение #3235] Mon, 09 October 2023 11:08 Переход к предыдущему сообщениюПереход к следующему сообщению
LeGO в настоящее время не в онлайне  LeGO
Сообщений: 4
Зарегистрирован: September 2023
Junior Member
Потому что это для теста делал) В MDI приложении тоже самое, здесь просто вырезано на данный момент лишнее, оставлена только сама суть.
У себя тоже убрал из uses Mad except(очень давно уже им пользуюсь, проблем не было никогда), ничего не поменялось к сожалению. После вызова формы и её закрытия, dll не удаляется.
Версия DELPHI 11.1  
Re: Использование форм в DLL [сообщение #3296 является ответом на сообщение #3189] Mon, 09 October 2023 11:16 Переход к предыдущему сообщениюПереход к следующему сообщению
LeGO в настоящее время не в онлайне  LeGO
Сообщений: 4
Зарегистрирован: September 2023
Junior Member
В основном приложении из таких dll не вызывается никаких функций, там только хранятся формы. Код был выложен из тестового exe, просто для понимания: если вызываешь функцию из dll, то dll потом можно удалить, вызвал форму, закрыл, dll не удаляется.
Основное приложение не мной написано, я на его развитии и поддержке сижу, формы в dll сам первый раз увидел, но менять ничего нельзя, такая концепция.
Кому интересно, в аттаче тестовый проект.
  • Вложение: DllForm.rar
    (Размер: 1.58MB, Загружено 294 раза)
Re: Использование форм в DLL [сообщение #3419 является ответом на сообщение #3296] Mon, 16 October 2023 00:15 Переход к предыдущему сообщению
Taнцop Пacaдoбля в настоящее время не в онлайне  Taнцop Пacaдoбля
Сообщений: 5
Зарегистрирован: August 2023
Junior Member
Dll понятно кто держит - вызывающее приложение, счетчик ссылок почему-то не обнулился.
Не факт, но возможно системный кэш может держать.





Предыдущая тема: Смещение рисунка в Image
Следующая тема: Заполнение полей голосом. Запись звука с микрофона и сохранение в wav для дальнейшего распознования.
Переход к форуму:
  


Текущее время: Fri Nov 22 12:42:53 GMT+3 2024

Общее время, затраченное на создание страницы: 0.00835 секунд