Мастера DELPHI, Delphi programming community Рейтинг@Mail.ru Титульная страница Поиск, карта сайта Написать письмо 
| Новости |
Новости сайта
Поиск |
Поиск по лучшим сайтам о Delphi
FAQ |
Огромная база часто задаваемых вопросов и, конечно же, ответы к ним ;)
Статьи |
Подборка статей на самые разные темы. Все о DELPHI
Книги |
Новинки книжного рынка
Новости VCL
Обзор свежих компонент со всего мира, по-русски!
|
| Форумы
Здесь вы можете задать свой вопрос и наверняка получите ответ
| ЧАТ |
Место для общения :)
Орешник |
Коллекция курьезных вопросов из форумов
KOL и MCK |
KOL и MCK - Компактные программы на Delphi
Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / rsdn.org

 
Чтобы не потерять эту дискуссию, сделайте закладку « предыдущая ветвь | форум | следующая ветвь »

bpl и initialization


d_oleg ©   (05.06.07 13:32

Вынес компонент TDBGridEh в отдельный подгружаемый пакет (изд), в результате (в пакете) у него не выполняется код секции initialization. Как быть с initialization внутри bpl?


Reindeer Moss Eater ©   (05.06.07 13:41[1]

Странная логика.
Вынес TDBGridEh и именно из за этого у пакета перестала выполняться initialization.


d_oleg ©   (05.06.07 13:44[2]

Не у пакета, у TDBGridEh


Reindeer Moss Eater ©   (05.06.07 13:44[3]

PS у тебя не initialization не выполняется. У тебя скорее всего сама bpl не грузится.


d_oleg ©   (05.06.07 13:45[4]

Когда компонент внутри exe, его секция initialization выполняется, если компонент в пакете - нет


Reindeer Moss Eater ©   (05.06.07 13:45[5]

Не у пакета, у TDBGridEh

Откуда у класса взялись какие-то initialization?
Ничего не путаешь?


d_oleg ©   (05.06.07 13:46[6]

bpl грузится


Reindeer Moss Eater ©   (05.06.07 13:47[7]

Когда компонент внутри exe, его секция initialization выполняется, если компонент в пакете - нет

Внимательно изучи назначение секций requires и contains пакета.


Reindeer Moss Eater ©   (05.06.07 13:47[8]

bpl грузится

Спорим, что нет?


d_oleg ©   (05.06.07 13:47[9]


> Откуда у класса взялись какие-то initialization?

initialization, конечно, не у класса, а в модуле, в котором этот класс описывается. Когда этот модуль находится в пакете, эта секция не выполняется.


d_oleg ©   (05.06.07 13:48[10]


> Спорим, что нет?

чего мне спорить, во-первых я его руками загружаю, во вторых в 100kb-экзешнике никак не может находится VCL да ещё и с доп. компонентами.


Reindeer Moss Eater ©   (05.06.07 13:54[11]

Что-то я не пойму замысел архитектора.
Собрать приложение с рантайм пакетом ЕхЛиба, а потом вручную загружать его бпл.


d_oleg ©   (05.06.07 13:57[12]

Приложение само по себе ни о каком ЕхЛибе не знает, компилируется без этого пакета. Когда в нем в run-time создается форма из текстового описания, в которой используется соотв. грид, тогда пакет и подгружается. Ну да не в этом вопрос, вопрос "как заставить выполняться initialization внутри пакета".


Reindeer Moss Eater ©   (05.06.07 14:01[13]

initialization модуля, если на него есть ссылки, не может не выполниться.

Один раз за все время существования процесса.


d_oleg ©   (05.06.07 14:22[14]

если на него ссылки есть где? В exe или в пакете?


Reindeer Moss Eater ©   (05.06.07 14:26[15]

Exe ничего же не знает по библиотеку.

Внутри bpl вообще есть где-нибудь RegisterClass на грид?


d_oleg ©   (05.06.07 15:05[16]


> Внутри bpl вообще есть где-нибудь RegisterClass на грид?
нет


d_oleg ©   (05.06.07 15:07[17]

RegisterClass делается в exe после загрузки пакета перед созданием компонента


Reindeer Moss Eater ©   (05.06.07 15:22[18]

Интересно, как это делается в exe, если он ничего ни о ехлибе ни о его гриде не знает?


d_oleg ©   (05.06.07 17:53[19]

после того, как exe подгрузил пакет, уже знает. Сканирует классы в пакете и регистрирует нужный.


Reindeer Moss Eater ©   (05.06.07 21:06[20]

после того, как exe подгрузил пакет, уже знает.
Все чудесатее и чудесатее.

Ему (еxe), чтобы вызвать RegisterClass надо еще на этапе компиляции "видеть" этот класс. Иначе он не соберется.
А exe у нас, согласно анамнезу, ничего не знает про ехлиб.


d_oleg ©   (05.06.07 22:56[21]

> Reindeer Moss Eater, че б ему не собраться-то, собирается как миленький.
http://www.interface.ru/home.asp?artId=3663 - почитай, тут все описано.


Reindeer Moss Eater ©   (06.06.07 00:10[22]

Ты сам-то читал?

Класс регистрируется при помощи процедуры RegisterClass(AClass: TPersistentClass). После того как мы пропарсили ресурс формы мы имеем только имя класса. Delphi не предоставляет стандартных процедур регистрации класса по его имени (получения указатель на класс при помощи функции GetClass(const ClassName: string), если он еще не зарегистрирован, естественно нельзя).

То есть если твой exe во время компиляции ДЕЙСТВИТЕЛЬНО ничего не знал о ехлибе, то и зарегистрировать он его не сможет.
Регистрировать его должен сам пакет.
Тогда exe сможет сделать GetClass и создать экземпляр.


Reindeer Moss Eater ©   (06.06.07 00:14[23]

И наоборот:
Если твой еxe собрался с registerclass, значит модуль прикомпилирован к нему. Возможно он прикомпилирован еще зачем-то и к пакету.

Но initialization вызывается один раз на весь процесс.

И в модуле который есть и в пакете и в exe эта секция (у модуля в пакете)не будет вызвана.


Юрий Зотов ©   (06.06.07 00:52[24]

> Reindeer Moss Eater ©   (06.06.07 00:10) [22]

> если твой exe во время компиляции ДЕЙСТВИТЕЛЬНО ничего не знал о
> ехлибе, то и зарегистрировать он его не сможет.

Сможет. Существует полухакерская методика нахождения всех классов в исполнимом модуле (exe, dll, bpl). А найдя класс, можно уже и RegisterClass вызвать.


Юрий Зотов ©   (06.06.07 01:04[25]

> d_oleg

Секция инициализации может не выполняться, если Вы грузите BPL не средствами VCL (то есть, без вызова InitializePackage), а как обычную DLL.

Аналогично и с секцией финализации - чтобы она выполнилась, должна быть вызвана FinalizePackage.


d_oleg ©   (06.06.07 09:33[26]


> Delphi не предоставляет стандартных процедур регистрации
> класса по его имени
А следующий абзац прочитать не судьба что ли?


Reindeer Moss Eater ©   (06.06.07 09:37[27]

А следующий абзац прочитать не судьба что ли?

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

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


d_oleg ©   (06.06.07 10:20[28]


> наверное используется волшебная метордика

Не совсем понятно, в чем разница. RegisterClass же все равно вызывается, разве не в этот момент должен вызываться Initialize модуля, в котором он описан?


d_oleg ©   (06.06.07 10:23[29]

Ладно, судя по всему, не в этот момент. Тогда как можно вызвать этот несчастный Initialize? Bpl же фактически не дает ничего с собой сделать (DllProc переопределить хотя бы), хоть это и dll как будто бы.


Юрий Зотов ©   (06.06.07 11:27[30]

> Тогда как можно вызвать этот несчастный Initialize

Можно грузить пакет вызовом LoadPackage, тогда Initialize вызовется автоматически. Можно вызывать Initialize и ручками.

Загляните в исходники SysUtils, посмотрите, как работают и что делают LoadPackage, Initialize и другие функции для работы с пакетами. Загляните в справку (раздел "package support routines"). Много полезного найдете.

PS
На полухакерскую методику я бы полагаться не стал. Потому что не исключено, что со сменой версии Delphi (т.е., компилятора) она работать перестанет. А тогда рухнет не только программа, но и сам главный принцип ее построения.


d_oleg ©   (06.06.07 12:08[31]


> Можно грузить пакет вызовом LoadPackage, тогда Initialize
> вызовется автоматически.
даже в том случае, если в exe нет ссылки на класс в пакете?


> Загляните в исходники SysUtils
спасибо за наводку, посмотрю.


Юрий Зотов ©   (06.06.07 13:33[32]

> d_oleg ©   (06.06.07 12:08) [31]

Даже и в том случае, когда пакет вообще не содержит ни одного класса.
:о)


DrPass ©   (07.06.07 00:27[33]


> Секция инициализации может не выполняться, если Вы грузите
> BPL не средствами VCL (то есть, без вызова InitializePackage),
>  а как обычную DLL

А еще, кстати, она не выполняется для неявно импортированных модулей независимо от того, как пакет загружен.


Юрий Зотов ©   (07.06.07 19:24[34]

> DrPass ©   (07.06.07 00:27) [33]

> для неявно импортированных модулей

Жень, просвети - а что такое "неявно импортированные модули"?


DrPass ©   (07.06.07 23:49[35]


> Юрий Зотов ©   (07.06.07 19:24) [34]

Тю... Если
а) модуль отсутствует в секции contains
б) другой пакет, содержащий этот модуль, в секции requires тоже отсутствует
в) однако ссылка на этот модуль присутствует где-нибудь в uses других включенных в пакет модулей
...то такой модуль тоже "затянется" в пакет. Неявно. О чем компоновщик даже предупредит.


Юрий Зотов ©   (08.06.07 00:14[36]

> DrPass ©   (07.06.07 23:49) [35]

Теперь понял, спасибо. Просто у меня таких штук не бывает, поэтому и не въехал.


Суслик ©   (08.06.07 10:06[37]


> в) однако ссылка на этот модуль присутствует где-нибудь
> в uses других включенных в пакет модулей
> ...то такой модуль тоже "затянется" в пакет. Неявно. О чем
> компоновщик даже предупредит.

меня это вообще бесит. все должно быть явно.
фигово то, что у них документировано это все фигово :)

вообще я стараюсь никогда не делать неявного включения. ибо надо помнить особенности.


DrPass ©   (08.06.07 12:22[38]


> Суслик ©   (08.06.07 10:06) [37]



> меня это вообще бесит. все должно быть явно.

Нет, если по-хорошему, то такая ситуация - это признак небрежности или невнимательности разработчика, Delphi тут не причем.


Суслик ©   (09.06.07 01:35[39]


> DrPass ©   (08.06.07 12:22) [38]


>  Delphi тут не причем.

язык д.б. специфицированным.
обсуждаемая фича не описана в доке.


Суслик ©   (09.06.07 01:35[40]


> DrPass ©   (08.06.07 12:22) [38]


>  Delphi тут не причем.

язык д.б. специфицированным.
обсуждаемая фича не описана в доке.


Talat   (25.11.15 02:56[41]

Удалено модератором


имя   (21.04.16 14:39[42]

Удалено модератором


имя   (21.04.16 15:32[43]

Удалено модератором


имя   (24.05.16 02:15[44]

Удалено модератором


версия для печати

Написать ответ

Ваше имя (регистрация  E-mail 







Разрешается использование тегов форматирования текста:
<b>жирный</b> <i>наклонный</i> <u>подчеркнутый</u>,
а для выделения текста программ, используйте <code> ... </code>
и не забывайте закрывать теги! </b></i></u></code> :)


Наверх

  Рейтинг@Mail.ru     Титульная страница Поиск, карта сайта Написать письмо