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

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

bpl и initialization


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 тут не причем.

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


Страницы: 1 2 3 версия для печати

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

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







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


Наверх

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