-
после того, как exe подгрузил пакет, уже знает.
Все чудесатее и чудесатее.
Ему (еxe), чтобы вызвать RegisterClass надо еще на этапе компиляции "видеть" этот класс. Иначе он не соберется.
А exe у нас, согласно анамнезу, ничего не знает про ехлиб.
-
-
Ты сам-то читал?
Класс регистрируется при помощи процедуры RegisterClass(AClass: TPersistentClass). После того как мы пропарсили ресурс формы мы имеем только имя класса. Delphi не предоставляет стандартных процедур регистрации класса по его имени (получения указатель на класс при помощи функции GetClass(const ClassName: string), если он еще не зарегистрирован, естественно нельзя).
То есть если твой exe во время компиляции ДЕЙСТВИТЕЛЬНО ничего не знал о ехлибе, то и зарегистрировать он его не сможет.
Регистрировать его должен сам пакет.
Тогда exe сможет сделать GetClass и создать экземпляр.
-
И наоборот:
Если твой еxe собрался с registerclass, значит модуль прикомпилирован к нему. Возможно он прикомпилирован еще зачем-то и к пакету.
Но initialization вызывается один раз на весь процесс.
И в модуле который есть и в пакете и в exe эта секция (у модуля в пакете)не будет вызвана.
-
> Reindeer Moss Eater © (06.06.07 00:10) [22]
> если твой exe во время компиляции ДЕЙСТВИТЕЛЬНО ничего не знал о
> ехлибе, то и зарегистрировать он его не сможет.
Сможет. Существует полухакерская методика нахождения всех классов в исполнимом модуле (exe, dll, bpl). А найдя класс, можно уже и RegisterClass вызвать.
-
> d_oleg
Секция инициализации может не выполняться, если Вы грузите BPL не средствами VCL (то есть, без вызова InitializePackage), а как обычную DLL.
Аналогично и с секцией финализации - чтобы она выполнилась, должна быть вызвана FinalizePackage.
-
> Delphi не предоставляет стандартных процедур регистрации
> класса по его имени
А следующий абзац прочитать не судьба что ли?
-
А следующий абзац прочитать не судьба что ли?
А кому нужен был ответ на вопрос?
Наводил тень на плетень и тут в районе тридцатого поста мы косвенно узнаем, что наверное используется волшебная метордика.
Если класс найден копанием внутри модуля, то ясен пень, что никаких ссылок на модуль в коде может и не быть. Даже если пакет грузится как пакет.
-
> наверное используется волшебная метордика
Не совсем понятно, в чем разница. RegisterClass же все равно вызывается, разве не в этот момент должен вызываться Initialize модуля, в котором он описан?
-
Ладно, судя по всему, не в этот момент. Тогда как можно вызвать этот несчастный Initialize? Bpl же фактически не дает ничего с собой сделать (DllProc переопределить хотя бы), хоть это и dll как будто бы.
-
> Тогда как можно вызвать этот несчастный Initialize
Можно грузить пакет вызовом LoadPackage, тогда Initialize вызовется автоматически. Можно вызывать Initialize и ручками.
Загляните в исходники SysUtils, посмотрите, как работают и что делают LoadPackage, Initialize и другие функции для работы с пакетами. Загляните в справку (раздел "package support routines"). Много полезного найдете.
PS
На полухакерскую методику я бы полагаться не стал. Потому что не исключено, что со сменой версии Delphi (т.е., компилятора) она работать перестанет. А тогда рухнет не только программа, но и сам главный принцип ее построения.
-
> Можно грузить пакет вызовом LoadPackage, тогда Initialize
> вызовется автоматически.
даже в том случае, если в exe нет ссылки на класс в пакете?
> Загляните в исходники SysUtils
спасибо за наводку, посмотрю.
-
> d_oleg © (06.06.07 12:08) [31]
Даже и в том случае, когда пакет вообще не содержит ни одного класса.
:о)
-
> Секция инициализации может не выполняться, если Вы грузите
> BPL не средствами VCL (то есть, без вызова InitializePackage),
> а как обычную DLL
А еще, кстати, она не выполняется для неявно импортированных модулей независимо от того, как пакет загружен.
-
> DrPass © (07.06.07 00:27) [33]
> для неявно импортированных модулей
Жень, просвети - а что такое "неявно импортированные модули"?
-
> Юрий Зотов © (07.06.07 19:24) [34]
Тю... Если
а) модуль отсутствует в секции contains
б) другой пакет, содержащий этот модуль, в секции requires тоже отсутствует
в) однако ссылка на этот модуль присутствует где-нибудь в uses других включенных в пакет модулей
...то такой модуль тоже "затянется" в пакет. Неявно. О чем компоновщик даже предупредит.
-
> DrPass © (07.06.07 23:49) [35]
Теперь понял, спасибо. Просто у меня таких штук не бывает, поэтому и не въехал.
-
> в) однако ссылка на этот модуль присутствует где-нибудь
> в uses других включенных в пакет модулей
> ...то такой модуль тоже "затянется" в пакет. Неявно. О чем
> компоновщик даже предупредит.
меня это вообще бесит. все должно быть явно.
фигово то, что у них документировано это все фигово :)
вообще я стараюсь никогда не делать неявного включения. ибо надо помнить особенности.
-
> Суслик © (08.06.07 10:06) [37]
> меня это вообще бесит. все должно быть явно.
Нет, если по-хорошему, то такая ситуация - это признак небрежности или невнимательности разработчика, Delphi тут не причем.
-
> DrPass © (08.06.07 12:22) [38]
> Delphi тут не причем.
язык д.б. специфицированным.
обсуждаемая фича не описана в доке.