Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / не работает подгруженный BPL при Link width runtime packages равно False / 25 сообщений из 43, страница 1 из 2
13.05.2021, 13:02
    #40069961
yemets63
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
не работает подгруженный BPL при Link width runtime packages равно False
в продолжение моих ранних тем BPL и/или DLL. динамически подгружаемые визуальные элементы форм.
тема достаточно не новая, но я не нашел где люди конкретно разобрались с этим, такое чувство что с книжки печатают в форумы.

Проект
Код: pascal
1.
2.
3.
4.
5.
HandlePack := LoadPackage('file_name.bpl');
if HandlePack <> 0 then
begin
AClass := GetClass('cls_from_bpl');
end;


авторкласс 'cls_from_bpl' в 'file_name.bpl' зарегистрирован
И так реализация BPL на комптютере, где есть Delphi

Проект с параметром Link width runtime packages = True
Размер проекта 5 Мб.
мой BPL подгружается и выполняется. AClass := КЛАССУ

Проект с параметром Link width runtime packages = False
Размер проекта 20 Мб.
мой BPL подгружается но не может найти класс. AClass := nil

И так реализация на комптютере, где НЕТ Delphi

Проект с параметром Link width runtime packages = True
Размер проекта 5 Мб.
до подгрузки своего BPL дойти не могу, так как проект не может найти стандартные.

решения у меня есть, но мне они не нравятся. например подтянуть стандартные BPL и класть их в проект и прописывать пути и так далее.

вопрос, как правильно организовать, может бить директивами или иначе, чтобы стандартные BPL были не ссылками, и при параметре проекта Link width runtime packages = False вошли в проект как и положено. В дополнительно подгружаемые и выгружаемые мои BPL работали также хорошо, как и при Link width runtime packages = True
...
Рейтинг: 0 / 0
13.05.2021, 13:17
    #40069963
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
не работает подгруженный BPL при Link width runtime packages равно False
yemets63как правильно организовать

Никак, обломись. По определению BPL.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
13.05.2021, 14:26
    #40069990
white_nigger
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
не работает подгруженный BPL при Link width runtime packages равно False
yemets63
вопрос, как правильно организовать
Не придумывать велосипеды с квадратными колесами?
...
Рейтинг: 0 / 0
13.05.2021, 14:35
    #40069994
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
не работает подгруженный BPL при Link width runtime packages равно False
пользуй интерфейсы.

зы: какова цель всего этого движняка?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
13.05.2021, 14:41
    #40069996
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
не работает подгруженный BPL при Link width runtime packages равно False
Мимопроходящийкакова цель всего этого движняка?

Он же написал: формы в DLL-ках.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
13.05.2021, 14:45
    #40069998
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
не работает подгруженный BPL при Link width runtime packages равно False
13.05.2021 14:41, Dimitry Sibiryakov пишет:
> Он же написал: формы в DLL-ках.

ну дак и хрен с ними.
на кой ему понадобился "прямой доступ" к объектам в этих DLL-ях, я лично не понимаю.

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
13.05.2021, 17:11
    #40070072
Virtual Student
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
не работает подгруженный BPL при Link width runtime packages равно False
Вроде, для решения вопроса, достаточно этого:
System.Classes
procedure RegisterClass(AClass: TPersistentClass);
procedure RegisterClasses(const AClasses: array of TPersistentClass);

Посмотри какие функции рядом...
Т.е. в загружаемой bpl зарегистрируй классы, к которым собираешься обращаться.
...
Рейтинг: 0 / 0
13.05.2021, 17:21
    #40070079
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
не работает подгруженный BPL при Link width runtime packages равно False
Virtual StudentТ.е. в загружаемой bpl зарегистрируй классы, к которым собираешься обращаться.

Без знания как именно происходит регистрация и понимания работы runtime - не взлетит.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
13.05.2021, 19:51
    #40070126
ziv-2014
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
не работает подгруженный BPL при Link width runtime packages равно False
Надо делать свою bpl с рантаймом rtl и vcl. И с ней компилировать в режиме Link width runtime packages = True
Или удалять лишние модули из списка, которые не нужны
...
Рейтинг: 0 / 0
13.05.2021, 21:55
    #40070157
yemets63
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
не работает подгруженный BPL при Link width runtime packages равно False
ziv-2014,

вот зная именно это я сделал то что должно грузиться из BPL, но когда начал смотреть, я не могу при сборке проекта BPL поставить эту директиву в опциях проекта DPK, ее просто нет, это меня и смутило.
раньше я создавал собственные компоненты, и ни когда не задумывался, так как я их импортировал в IDE и дальше все шло как по маслу,
у меня три способа RUNTIME изменений в формах, первый очень сложный - другая тема, второрй DLL и третий оказался очень прост в своей реализации но сложный в использовании, это BPL. но как рзграничить, те пакеты что постоянные и те пакеты что хочу подгружать и выгружать.
как правильно создать DPK BPL чтобы он слушался при его подсоединении к проекту, RTL и VCL в requires прописаны, классы все отрегистрированы.
...
Рейтинг: 0 / 0
14.05.2021, 08:14
    #40070201
Virtual Student
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
не работает подгруженный BPL при Link width runtime packages равно False
yemets63
ziv-2014,

вот зная именно это я сделал то что должно грузиться из BPL, но когда начал смотреть, я не могу при сборке проекта BPL поставить эту директиву в опциях проекта DPK, ее просто нет, это меня и смутило.
раньше я создавал собственные компоненты, и ни когда не задумывался, так как я их импортировал в IDE и дальше все шло как по маслу,
у меня три способа RUNTIME изменений в формах, первый очень сложный - другая тема, второрй DLL и третий оказался очень прост в своей реализации но сложный в использовании, это BPL. но как рзграничить, те пакеты что постоянные и те пакеты что хочу подгружать и выгружать.
как правильно создать DPK BPL чтобы он слушался при его подсоединении к проекту, RTL и VCL в requires прописаны, классы все отрегистрированы.

Ёлки-палки!
1. BPL - это такая же DLL , только со стандартизированным именованием функций внутри.
2. При загрузке/выгрузке (LoadPackage) автоматом выполняются функции @Initialization и @Finalization (угадайте, что они делают :) )
3. В секцию Initialization пишем RegisterClass(TMyForm). При этом, сам пакет MyModule.bpl не нужно прописывать в required исполняемого файла.
4. В нужном месте программы вызываете GetClass('TMyForm'), приводите класс (или извлекаете интерфейс) к своему базовому (от которого унаследована форма), создаете его экземпляр, и творите с ним что хотите!
5. По завершении "экзерсисов" с объектом выгружаете библиотеку (BPL).

У меня так все работает, начиная с 2005-го года... Должно и у в Вас "взлететь"!
...
Рейтинг: 0 / 0
14.05.2021, 08:24
    #40070203
Virtual Student
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
не работает подгруженный BPL при Link width runtime packages равно False
Соврал, функции называются Initialize и Finalize...
...
Рейтинг: 0 / 0
14.05.2021, 09:26
    #40070207
ziv-2014
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
не работает подгруженный BPL при Link width runtime packages равно False
Virtual Student,

3. В секцию Initialization пишем RegisterClass(TMyForm). При этом, сам пакет MyModule.bpl не нужно прописывать в required исполняемого файла.
Вопрос в том, где залинкована RegisterClass - в основном модуле или в какой-то bpl.
В JCL есть утилита, которая показывает, где залинкован код.
Надо ее использовать.
...
Рейтинг: 0 / 0
14.05.2021, 16:55
    #40070395
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
не работает подгруженный BPL при Link width runtime packages равно False
Virtual Student
У меня так все работает, начиная с 2005-го года... Должно и у в Вас "взлететь"!

У вас так работает при сборке приложения без использования Use Runtime Packages?.
...
Рейтинг: 0 / 0
14.05.2021, 17:16
    #40070402
Virtual Student
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
не работает подгруженный BPL при Link width runtime packages равно False
alekcvp
Virtual Student
У меня так все работает, начиная с 2005-го года... Должно и у в Вас "взлететь"!

У вас так работает при сборке приложения без использования Use Runtime Packages?.

Мля, только с подгружаемыми паетами будет толк.
...
Рейтинг: 0 / 0
15.05.2021, 22:44
    #40070557
yemets63
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
не работает подгруженный BPL при Link width runtime packages равно False
alekcvp
Virtual Student
У меня так все работает, начиная с 2005-го года... Должно и у в Вас "взлететь"!

У вас так работает при сборке приложения без использования Use Runtime Packages?.


ну сказать, "что я не знал?", нет, знал, но надеялся. обидно но с Runtime package = false не работают мои BPL , не получает классс.
в итоге два варианта, или прописывать все BPL и свои и стандартные, велика вероятность что то в будущем забыть и отправить проект с багом клиенту, или ни фига и выбрать другой путь. я чесс слово не знаю что там у Virtual Student без рантайм работает. Virtual Student конечно сделал некоторые полезные замечания, "но я вроде не первый день за рулем", в BPL есть и инициализация и закрытие, конечно когда появились траблы, пробовал прописывать RTL и библиотеки и использовать их как только в BPL, вместе и раздельно. по сути я не понимаю причины, почему без рантайм нельзя в середине хода программы по желанию загрузить BPL , что то сделать из(в) BPL и выгрузить BPL. это работает только при рантайм.
и в момент, когда я загружаю BPL я получаю его, но как только начинаю подключать или искать класс из BPL, не вижу я его в основном проекте, он всегда nil. может я что не так делаю.


вот думаю, читать еще BPL и танцы с бубном дргих людей,
или использовать DLL , опять выбор, но DLL опять игра с бубном, из готовых функционвльных модулей, у меня более 20 имеют формы, открывать отдельно эти формы, не красиво, разворачивать как MDI в MDI, ну это извращение, фреймы - ёлки пали, сразу начнуться Ancestor и его низкие формы с фреймаи, выводить в Panel, например как я делаю в BPL, но так в DLL работать не будет, и потом DLL, как не крути это другой размер. Сейчас проект получился достаточно читаемый, без награмождений и без сотни форм наследников. конечно все модули подключить в проект и вопрос решен, но хотелось бы в будущем при необходимости изменить модуль поменять его версию и далее на рабочем месте основного модуля программы просто подменить один модуль функциональности.

кучу маленьких EXE делать - как то позорно и опять же размер.

есть еще одно извращение, лет много назад, ровно в 2007 - 2008 делал проект с использованием скрипта сборки DFM с исходным кодом, все работало, но тот проект был сугубо внутренний, особо ни чего не ломалось, работало. но он был до ужаса сложный, все запятые приходилось учитывать и обрабатывать

может еще будут у кого идеи, как получить КЛАСС из BPL, ну и дальше по описанной проблеме при Link ... Runtime = false .
...
Рейтинг: 0 / 0
16.05.2021, 00:11
    #40070564
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
не работает подгруженный BPL при Link width runtime packages равно False
yemets63по сути я не понимаю причины, *почему без рантайм нельзя в середине хода программы по
желанию загрузить BPL*

Понимание - результат опыта. Начни изучать RTL и VCL (исходники доступны). Изучать как
работает система (книга Рихтера тебе в руки). Тогда и понимание придёт.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
16.05.2021, 10:18
    #40070589
kapas
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
не работает подгруженный BPL при Link width runtime packages равно False
yemets63, тема давнишняя, мерзопакостная...
Мне например очень сильно помог след. пример (в прилагаемом файле. Нашел ссылку на этом же форуме в одном из очень старых сообщений). Обратите внимание на настройки проекта.
...
Рейтинг: 0 / 0
16.05.2021, 11:27
    #40070599
yemets63
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
не работает подгруженный BPL при Link width runtime packages равно False
Dimitry Sibiryakov,

Совет принял. Есть у меня под рукой Рихтер.
Я понимаю, как это сделано в системе, но я не понимаю, почему это не упрощено и просто не доступно в IDE. по сути мы делаем все правильно, но для подключения своих пакетов в период работы мы зависим просто от одной галочки.

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

пару путных идей проскочило, пока я попробовал сделать общий проект BPL для теста, и туда все знагнал стандартное, ура работает, но как то я не доверяю тому, что получилось.
пробую возникшие идеи опробовать.

если буду совсем тонуть, напишу.
...
Рейтинг: 0 / 0
16.05.2021, 12:27
    #40070608
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
не работает подгруженный BPL при Link width runtime packages равно False
yemets63,

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

Возможный вариант, который мне в голову приходит - эмулировать BPL обычной DLL-кой. Сделать обычную DLL, которая экспортирует функции Initialize , Finalize и RegisterClasses() , причём последняя объявлена как-то так:
Код: pascal
1.
2.
3.
4.
type
  TRegisterProc = procedure (AClass: TPersistentClass);

procedure RegisterClasses(RegisterProc: TRegisterProc);

И вызывать её из приложения, передавая ей процедуру RegisterClass() параметром.

Насколько это будет работать в таком виде - я хз, надо тестировать.

И да, не забудь про общий менеджер памяти.
...
Рейтинг: 0 / 0
16.05.2021, 12:49
    #40070611
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
не работает подгруженный BPL при Link width runtime packages равно False
yemets63Я понимаю, как это сделано в системе

Уверен? Ты точно понимаешь, что у каждой DLL и EXE - свои собственные глобальные
переменные и свой собственный набор функций, обращающихся к ним?

Если ты это реально понимаешь - как ты себе представляешь "галочку", способную заставить
DLL обращаться к глобальным переменным EXE-шника?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
16.05.2021, 13:16
    #40070617
yemets63
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
не работает подгруженный BPL при Link width runtime packages равно False
Dimitry Sibiryakov,

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

в DLL у меня результат есть, но это 20 метров на файл, нет смысла вытаскивать модули функциональностей в отдельные файлы. так как можно всё положить в EXE, который весит не так много и его обновлять.
галочка имеет достаточно полезный смысл, и когда я добавляю свои пакеты в начале, и они входят в EXE то проблем нет ни каких.
чем мне приглянулся BPL, это 20 модулей функциональностей и всего 10 метров максимум.

я получил класс, в моем случае, но не пойму, потому что так не должно быть, пока на стадии тестирования
Код: pascal
1.
2.
LoadPackage( // загрузил пакет
AClass := GetClass('   // nil


запускаю второй раз
Код: pascal
1.
2.
LoadPackage( // загрузил пакет
AClass := GetClass('   // успех



третий раз опять же может быть или успех или NIL, почему так, но это что то другое.

и так танцую с бубном дальше
...
Рейтинг: 0 / 0
16.05.2021, 13:26
    #40070619
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
не работает подгруженный BPL при Link width runtime packages равно False
yemets63в DLL у меня результат есть

Мне совершенно всё равно какой резльтат у тебя есть. Я спросил точно ли ты понимаешь, что
каждая DLL и EXE имеют разные глобальные переменные. Но, судя по твоим танцам -
таки нет. В морг.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
16.05.2021, 14:15
    #40070626
yemets63
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
не работает подгруженный BPL при Link width runtime packages равно False
Dimitry Sibiryakov,

прям как на экзамене, "Adobe.exe и Word.exe могут иметь общие глобальные переменные"?, :)
...
Рейтинг: 0 / 0
16.05.2021, 14:58
    #40070632
yemets63
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
не работает подгруженный BPL при Link width runtime packages равно False
alekcvp,

dll работает, проблема в размере файла DLL, пропадает смысл оптимизации модулей функциональностей,

в данный момент цель это запуск самих BPL,
DLL или BPL или даже EXE по сути без разницы, но BPL в сравнении с другими дает лучший результат

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

передача параметра из EXE в BPL или в DLL проходит нормально. обратно из BPL в EXE этого делать не нужно, результат уходит в базу.

основной EXE это просто GUI отправки задачи на ранзные PC и получение результата, основной EXE не меняется по сути ни разу, ну может раз в полгода, т.е. автоматическое обновление ему не так важно как обновление отдельных функциональностей. интерфейс на 95% custom.
сейчас всё это работает, и даже с обновлением отдельных функциональностей, но достаточно старые механизмы, некоторые я делал еще в 2004,
и так как проект требует расширение, есть желание некоторые моменты сделать лучше. все функциональности были переработаны, сделано уже много, есть желание сделать то, на чем я тормознул, это BPL и продолжить создание новых функциональностей. Правильно оптимизировав что то сейчас, упрощаеться жизнь в будущем.

пока решение есть одно, и оно работает:
ни чего не меняя, положил все стандартные BPL в одно место и прописал пути. на трех VM посмотрел, полет нормальный, но такое решение влечет вероятность ошибки в будущем. после перекомпиляции вылетит какая нибудь библиотека, об этом Delphi не сообщит даже при BUILD, в итоге клиент получит BUG. об этом я уже писал.

решения из Plugins похожи на мои, и буквально вчера я это проделывал, и так пример из Plugins:
в самой DEMO.EXE куда загружаются BPL, дублируется вызов самих PAS используемых в BPL. По сути получается два проекта со своими глобальными переменными, на зависимо от имен. EXE и BPL. но в DEMO.EXE отрабатывается тот PAS который был собран в EXE, а не тот который был загружен из BPL.
и еще один момент есть не хороший, который я обнаружил, но это вторая часть проблемы.
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / не работает подгруженный BPL при Link width runtime packages равно False / 25 сообщений из 43, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]