powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / не работает подгруженный BPL при Link width runtime packages равно False
25 сообщений из 43, страница 1 из 2
не работает подгруженный BPL при Link width runtime packages равно False
    #40069961
yemets63
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в продолжение моих ранних тем 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
не работает подгруженный BPL при Link width runtime packages равно False
    #40069963
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
yemets63как правильно организовать

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

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

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

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

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

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

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

вот зная именно это я сделал то что должно грузиться из BPL, но когда начал смотреть, я не могу при сборке проекта BPL поставить эту директиву в опциях проекта DPK, ее просто нет, это меня и смутило.
раньше я создавал собственные компоненты, и ни когда не задумывался, так как я их импортировал в IDE и дальше все шло как по маслу,
у меня три способа RUNTIME изменений в формах, первый очень сложный - другая тема, второрй DLL и третий оказался очень прост в своей реализации но сложный в использовании, это BPL. но как рзграничить, те пакеты что постоянные и те пакеты что хочу подгружать и выгружать.
как правильно создать DPK BPL чтобы он слушался при его подсоединении к проекту, RTL и VCL в requires прописаны, классы все отрегистрированы.
...
Рейтинг: 0 / 0
не работает подгруженный BPL при Link width runtime packages равно False
    #40070201
Фотография Virtual Student
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
не работает подгруженный BPL при Link width runtime packages равно False
    #40070203
Фотография Virtual Student
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Соврал, функции называются Initialize и Finalize...
...
Рейтинг: 0 / 0
не работает подгруженный BPL при Link width runtime packages равно False
    #40070207
ziv-2014
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Virtual Student,

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

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

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

Мля, только с подгружаемыми паетами будет толк.
...
Рейтинг: 0 / 0
не работает подгруженный BPL при Link width runtime packages равно False
    #40070557
yemets63
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
не работает подгруженный BPL при Link width runtime packages равно False
    #40070564
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
yemets63по сути я не понимаю причины, *почему без рантайм нельзя в середине хода программы по
желанию загрузить BPL*

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

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

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

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

если буду совсем тонуть, напишу.
...
Рейтинг: 0 / 0
не работает подгруженный BPL при Link width runtime packages равно False
    #40070608
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
не работает подгруженный BPL при Link width runtime packages равно False
    #40070611
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
yemets63Я понимаю, как это сделано в системе

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

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

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

прям как на экзамене, "Adobe.exe и Word.exe могут иметь общие глобальные переменные"?, :)
...
Рейтинг: 0 / 0
не работает подгруженный BPL при Link width runtime packages равно False
    #40070632
yemets63
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
25 сообщений из 43, страница 1 из 2
Форумы / Delphi [игнор отключен] [закрыт для гостей] / не работает подгруженный BPL при Link width runtime packages равно False
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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