Конференция "Компоненты" » 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 тут не причем.

    язык д.б. специфицированным.
    обсуждаемая фича не описана в доке.
 
Конференция "Компоненты" » bpl и initialization
Есть новые Нет новых   [134427   +34][b:0][p:0.001]