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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Зависание приложения при выгрузке dll библиотеки с 
:(
    Опции темы
MaximusVRN
Дата 20.10.2014, 21:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 26.5.2014

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



Цитата(DarkProg @ 20.10.2014,  17:29)
Ну собственно теперь становится понятнее откуда ноги растут у проблемы.

А вообще лёгкий гуглинг приводит вот к такой любопытной статье 
Все ли требования соблюдены у вас, потому что исходников у нас нет?

Видел эту статью, но ничего кардинально отличающегося не заметил, кроме initialization и finalization, но внутри выполняется по сути тоже самое что и у меня.
Извиняюсь за отсустствие исходников, почему-то был уверен что приложил их. https://cloud.mail.ru/public/863e86e27a6e%2FApplication.zip
PM MAIL   Вверх
drkot
Дата 21.10.2014, 22:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ищущий
***


Профиль
Группа: Завсегдатай
Сообщений: 1042
Регистрация: 5.5.2006

Репутация: 5
Всего: 8



Могу посоветовать следующее:
1) function CreateHD(App: TApplication): TForm;
2) procedure CloseHD(Form: TForm);

Скорее всего проблема возникает еще при инициализации формы. 
И очень может быть ввиду "неполноценного" Application в DLL.
Поэтому логичнее привязывать форму к Application приложения.


--------------------
Ошибка не становится истиной по причине широкого распространения,
как и Истина не становится Ошибкой из-за того, что никто её не видит.
PM   Вверх
MaximusVRN
Дата 21.10.2014, 22:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 26.5.2014

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



Пробовал создавать на Application приложения, результата нет. Возвращение и передача объекта формы тоже думаю ничего не поправит, особенно учитывая что в библиотеке FMX форма, а в приложении VCL и скрещивать их нельзя.
PM MAIL   Вверх
DarkProg
Дата 22.10.2014, 01:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Законченный романтик
***


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

Репутация: 2
Всего: 19



Цитата

Step 5) Once the DLL is loading when you run the application, you are then able to call it using the SelectImage variable. Firstly add to the uses the following two uses.

uses unitLoadDLL, Winapi.GDIPOBJ;

The second uses declaration is a bit of a surprise initially, but once you understand that GDI+ can only be called from a main application and not from a DLL, it starts to make sense.


Я не увидел у вас в коде соблюдение вот этого пункта.

Добавлено через 16 секунд
Или уже слишком поздно и я не внимателен...


--------------------
"И твоя голова всегда в ответе за то куда сядет твой зад..."

"Я студент - скажите с какого я ВУЗа..."

 smile  smile  smile 
PM MAIL   Вверх
MaximusVRN
Дата 22.10.2014, 01:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 26.5.2014

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



Цитата(DarkProg @ 22.10.2014,  01:00)
Цитата

Step 5) Once the DLL is loading when you run the application, you are then able to call it using the SelectImage variable. Firstly add to the uses the following two uses.

uses unitLoadDLL, Winapi.GDIPOBJ;

The second uses declaration is a bit of a surprise initially, but once you understand that GDI+ can only be called from a main application and not from a DLL, it starts to make sense.


Я не увидел у вас в коде соблюдение вот этого пункта.

Добавлено @ 01:00
Или уже слишком поздно и я не внимателен...

Пробовал добавлять вчера Winapi.GDIPOBJ в список модулей приложения, результата нет.
PM MAIL   Вверх
drkot
Дата 22.10.2014, 14:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ищущий
***


Профиль
Группа: Завсегдатай
Сообщений: 1042
Регистрация: 5.5.2006

Репутация: 5
Всего: 8



Цитата(MaximusVRN @  21.10.2014,  23:50 Найти цитируемый пост)
библиотеке FMX форма, а в приложении VCL

а как Вы мыслите работу формы без инициализации объекта Application?
Если в VCL там не производилось никаких критичных действий, то это не значит что в FM этого нет.

Цитата(MaximusVRN @  21.10.2014,  23:50 Найти цитируемый пост)
Пробовал создавать на Application приложения, результата нет

как пробовали? какой код не сработал?


--------------------
Ошибка не становится истиной по причине широкого распространения,
как и Истина не становится Ошибкой из-за того, что никто её не видит.
PM   Вверх
MaximusVRN
Дата 22.10.2014, 14:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 26.5.2014

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



Цитата(drkot @ 22.10.2014,  14:03)
Цитата(MaximusVRN @  21.10.2014,  23:50 Найти цитируемый пост)
Пробовал создавать на Application приложения, результата нет

как пробовали? какой код не сработал?

DLL библиотека
Код

procedure CreateHD(App: TApplication);
begin
  FormHD := TFormHD.Create(App);
  FormHD.Caption := 'HD';
  FormHD.Show;
end;

Приложение VCL
Код

CreateHD(Application);

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


Ищущий
***


Профиль
Группа: Завсегдатай
Сообщений: 1042
Регистрация: 5.5.2006

Репутация: 5
Всего: 8



Использовать внутреннюю глобальную переменную в длл не правильно. 
Вы не в состоянии контролировать ее значение.
Как минимум можно дважды вызвать CloseHD (или CreateHD) 

Теперь по существу вопроса:
Как удалось выяснить идет взаимная блокировка потоков. Основной поток ждет завершения некоторого вторичного.
И если с основным потоком все понятно... он ждет завершения дочерних, то чего ждет этот дочерний не совсем понятно.

Есть подозрение, что перед выгрузкой нужно выполнить некоторое дополнительное действие.

Если не выполнять выгрузку библиотеки, то при выходе вылетаем на 216, следовательно лезем в чужую память.
Возможно FM не заточен под данный механизм, в следствии чего Application в Dll не в состоянии нормально завершиться.

Добавлено через 1 минуту и 34 секунды
К стати, без вызова функций библиотека нормально выгружается.
Значит "необратимые" изменения происходят при создании формы.


--------------------
Ошибка не становится истиной по причине широкого распространения,
как и Истина не становится Ошибкой из-за того, что никто её не видит.
PM   Вверх
drkot
Дата 22.10.2014, 19:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ищущий
***


Профиль
Группа: Завсегдатай
Сообщений: 1042
Регистрация: 5.5.2006

Репутация: 5
Всего: 8



После ряда экспериментов ситуация следующая:
Логика работы FM кардинально отличается от VCL. Синтаксическое сходство всего лишь маскарад.
Большинство (если не все) действия производятся асинхронно посредством конвейеров.
Инициализация последних в Dll происходит крайне криво. Причина в том, что запуск конвейеров производится в Application.Run, который просто не вызывается в библиотеке.
Причиной падения (при вызове Form1.Free) связано с отсутствием интерфейса:
Код

    FWinService: IFMXWindowService;

Если вызвать 
Код

Form1.Free;
Form1:= nil;

Падаем на обращении по адресу nil. 
Причем это разные потоки.

Так что использовать формы FM в dll использовать в чистом виде не получится. Теоретически возможно написать хелпер с функцией RunDll которая будет дублировать Run за исключением чего-то там... Так что задача далеко не тривиальна...

PS: из личностей заявивших о решении данной проблемы ни одна реализация не лишена выше изложенных проблем. Самые "хитрые" просто не удаляют форму... то-есть лезут утечки...

Добавлено через 11 минут и 9 секунд
Вот более менее работающий пример.
Главная проблема освобождение памяти не происходит (на мой взгляд).
Но лучше не получилось... Во всяком случае не вылазят исключения...

Нормальное освобождение памяти можно получить только при компиляции с пакетами.


Присоединённый файл ( Кол-во скачиваний: 7 )
Присоединённый файл  FMTest.rar 29,81 Kb


--------------------
Ошибка не становится истиной по причине широкого распространения,
как и Истина не становится Ошибкой из-за того, что никто её не видит.
PM   Вверх
MaximusVRN
Дата 23.10.2014, 00:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 26.5.2014

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



Цитата(drkot @ 22.10.2014,  19:44)
Вот более менее работающий пример.
Главная проблема освобождение памяти не происходит (на мой взгляд).
Но лучше не получилось... Во всяком случае не вылазят исключения...

Нормальное освобождение памяти можно получить только при компиляции с пакетами.

Исключения не вылазят, но приложение при выгрузке падает, да и приложение на FMX форме, а нужно на VCL.
У меня была идея - создать две библиотеки. Т.е. приложение динамически подключает первую библиотеку, а она в свою очередь вторую, тоже динамически, которая непосредственно содержит форму. И т.к. приложение зависало при выгрузке библиотеки, просто не производим выгрузку второй библиотеки в первой. А саму первую библиотеку приложение будет выгружать без проблем. Костыль ужасный, но зато никаких зависаний и исключений, правда утечка тоже будет.
Похоже либо придётся отказаться от FMX в библиотеке, либо смириться с утечкой.
PM MAIL   Вверх
drkot
Дата 23.10.2014, 02:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ищущий
***


Профиль
Группа: Завсегдатай
Сообщений: 1042
Регистрация: 5.5.2006

Репутация: 5
Всего: 8



мне послышалось вы сказали спасибо?

Цитата(MaximusVRN @  23.10.2014,  01:32 Найти цитируемый пост)
да и приложение на FMX форме, а нужно на VCL

без разницы 
Цитата(MaximusVRN @  23.10.2014,  01:32 Найти цитируемый пост)
 выгрузку второй библиотеки в первой

думаю Вы ошибаетесь
Цитата(MaximusVRN @  23.10.2014,  01:32 Найти цитируемый пост)
смириться с утечкой

дело не в утечке... дело в том, что Ваш Ёж спариваться с Ужем не будет и думаю понимаете что получится.
Цитата(MaximusVRN @  23.10.2014,  01:32 Найти цитируемый пост)
приложение при выгрузке падает

мне показалось то не падает...


--------------------
Ошибка не становится истиной по причине широкого распространения,
как и Истина не становится Ошибкой из-за того, что никто её не видит.
PM   Вверх
MaximusVRN
Дата 23.10.2014, 11:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 26.5.2014

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



Разумеется спасибо огромное.

Цитата(drkot @  23.10.2014,  02:43 Найти цитируемый пост)
дело не в утечке... дело в том, что Ваш Ёж спариваться с Ужем не будет и думаю понимаете что получится.

Я так понимаю даже если закрыть глаза на проблемы выгрузки, сама работа формы и её компонентов будет нестабильна в dll?
PM MAIL   Вверх
DarkProg
Дата 25.10.2014, 18:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Законченный романтик
***


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

Репутация: 2
Всего: 19



Цитата(MaximusVRN @  23.10.2014,  11:49 Найти цитируемый пост)
Я так понимаю даже если закрыть глаза на проблемы выгрузки, сама работа формы и её компонентов будет нестабильна в dll? 

Сама форма то будет судя по всему работать стабильно, если уж открылась, а вот при попытке корректного завершения(судя по проведённым исследованиям drkot) будете получать неприятности различного рода.


--------------------
"И твоя голова всегда в ответе за то куда сядет твой зад..."

"Я студент - скажите с какого я ВУЗа..."

 smile  smile  smile 
PM MAIL   Вверх
drkot
Дата 25.10.2014, 23:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ищущий
***


Профиль
Группа: Завсегдатай
Сообщений: 1042
Регистрация: 5.5.2006

Репутация: 5
Всего: 8



Цитата(DarkProg @  25.10.2014,  19:25 Найти цитируемый пост)
Сама форма то будет судя по всему работать стабильно

гарантировать нельзя, пустая форма работает, но это не значит что при ее наполнении не вылезут баги... например динамические обновления компонентов глючить будут...
в Dll объект Application не инициализирован, почти все структуры nil... Собственно это при выгрузке dll и приводит к сбоям. Зависание вызывается ожиданием не инициализированного конвейера и так далее...

Добавлено через 3 минуты и 12 секунд
MaximusVRN, если нужна dx канва, то проще ее подцепить к VCL форме, чем бодаться с FM


--------------------
Ошибка не становится истиной по причине широкого распространения,
как и Истина не становится Ошибкой из-за того, что никто её не видит.
PM   Вверх
MaximusVRN
Дата 26.10.2014, 13:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 26.5.2014

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



Цитата(drkot @  26.10.2014,  00:39 Найти цитируемый пост)
MaximusVRN, если нужна dx канва, то проще ее подцепить к VCL форме, чем бодаться с FM 

Нет, к сожалению, нужен именно контейнер под динамически создаваемые компоненты FMX.
PM MAIL   Вверх
Google
  Дата 18.2.2020, 13:20 (ссылка)  





  Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

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

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

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

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


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

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


 




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


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

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