Форум: "Прочее";
Текущий архив: 2010.09.26;
Скачать: [xml.tar.bz2];
ВнизИнтересный вызов Initialization секции в BPL Найти похожие ветки
← →
bss (2010-06-29 21:49) [0]Есть BPL"ка под именем: lib.bpl
В ней есть модули: unit1.pas, unit2.pas
Есть вторая BPL"ка с именем: test.bpl, в ее юнитах в секции uses настроена зависимость на модуль unit1.pas из lib.bpl и нету зависимости на uni2.pas
При загрузке test.bpl по статической зависимости грузится lib.bpl. И наблюдаем странное - initialization модуля unit1.pas выполняется, а вот initialization модуля unit2.pas не выполняется! Если в модуле test.bpl сделать зависимость на unit2.pas - то тогда и там выполняется initialization.
На мой взгляд крайне странное поведение, но оно именно таковое, проверял несколько раз. Я думал секции initialization выполняются все при загрузке BPL, ну или что одно и тоже, когда загружается как DLL.
Поскольку это BPL - то значит, код юнита unit2.pas в любом случае должен быть включен в lib.bpl. Да и в целом это хрень какая-то - фактически выполнять ли секцию initialization определяется внешним модулем?!
← →
В школу! (2010-06-29 21:52) [1]если unit2 не используется, зачем его инициализировать ?
> На мой взгляд крайне странное поведение
ничего странного
> Да и в целом это хрень какая-то - фактически выполнять ли
> секцию initialization определяется внешним модулем?!
хрень у тебя в голове из-за недостатка знаний
← →
bss (2010-06-29 22:01) [2]
> если unit2 не используется, зачем его инициализировать ?
потому BPL - это фактически DLL. И грузится ей приходится единственным способом, аля LoadLibrary из разряда WinApi функций. И во время загрузки ее как DLL - по идее должны вызываться initialization всех модулей, потому что внешний модуль в контексте DLL уж точно не будет передавать информацию о том, какие модули он собирается использовать, а какие нет.
Я пока вообще не понимаю, каким образом срабатывает механизм, из-за которого initialization не используемого модуля не вызывается. Как это вообще возможно...
← →
bss (2010-06-29 22:07) [3]Если рассмотреть как это все работает со стороны Lib.bpl:
В некоем DLL/BPL/EXE имеются статические зависимости на нас в секциях импорта. Поэтому винда автоматически подгружает нас при загрузке этого внешнего модуля. Подгружает, естественно, как DLL"ку, по тем же правилам. По идее, мы должны сделать initialization всем своим модулям на входе DLLMain функции. Но этого не происходит...
Что это такой за механизм, который, видимо, определяет почему нас загружают, анализирует причину по которой нас загружают - и если это сторонняя BPL"ка то считывает информацию - какие юниты будут использованы?!
Вариант попроще - при сборке проекта как BPL initialization вообще не вызываются, а вызываются они потом непосредственно из секции DLLMain уже внешнего модуля? Интересно мнение тех, кто знает алгоритм.
← →
В школу! (2010-06-29 22:12) [4]
> потому BPL - это фактически DLL
Это не фактически, это точно DLL. Но к инициализации паскаля DLL не имеет никакого отношения.
> И во время загрузки ее как DLL - по идее должны вызываться
> initialization всех модулей, потому что внешний модуль в
> контексте DLL уж точно не будет передавать информацию о
> том, какие модули он собирается использовать, а какие нет.
>
> Я пока вообще не понимаю, каким образом срабатывает механизм,
> из-за которого initialization не используемого модуля не
> вызывается. Как это вообще возможно...
В случае DLL ответственность за инициализацию модулей берет на себя компилятор, составляя таблицу "инициализации" и "финализации", и обходя ее, соответственно, в StartLib и ExitLib.
В случае пакета, каждая инициализация и финализация экспортируются и ответственность за их вызов берет на себя вызывающий модуль и его таблицы.
И праввильно, в vcl100.bpl находится дохренища юнитов, если при загрузке этого bpl будут вызываться initialization всех без исключения, первое же приложение встанет раком и будет пятиться.
ЗЫ: думать - полезно
← →
bss (2010-06-30 11:12) [5]
> Это не фактически, это точно DLL
я имел в виду, что с точки зрения windows - это DLL, но с точки зрения Delphi это DLL с дополнительным служебным функционалом.
> И праввильно, в vcl100.bpl находится дохренища юнитов, если
> при загрузке этого bpl будут вызываться initialization всех
> без исключения
да, хороший пример.
Выходит, что в отличии от DLL при загрузке BPL выполнение секций initialization не происходит. Для меня это новость.
Вообще забавно. Чтобы все это работало - инициализация должна производиться вызывающим модулем, а вот финализация уже по выгрузке библиотеки для тех модулей, для которых во время работы была вызвана функция инициализации внешними модулями...
← →
Kerk © (2010-06-30 11:13) [6]
> bss (30.06.10 11:12) [5]
Посмотри вот это http://www.delphikingdom.com/asp/answer.asp?IDAnswer=59405
← →
bss (2010-06-30 11:16) [7]
> В случае пакета, каждая инициализация и финализация экспортируются
> и ответственность за их вызов берет на себя вызывающий модуль
> и его таблицы.
а вот это, думаю, не совсем правильно. Инициализация - да, а вот финализация скорее всего реализована самим модулем, а не внешним. Ибо внешний модуль не владеет знаниями, когда будет выгружен пакет.
← →
bss (2010-06-30 11:20) [8]
> Посмотри вот это
ну да, спасибо, там даже более развернутый ответ.
← →
Игорь Шевченко © (2010-06-30 13:02) [9]
> а вот это, думаю, не совсем правильно
зачем думать, когда есть отладчик и tdump ?
← →
bss (2010-06-30 14:05) [10]Вы хотите сказать, что финализация тоже вызывается внешним модулем? А как он тогда узнает, что ее можно делать? ....
← →
Игорь Шевченко © (2010-06-30 14:30) [11]bss (30.06.10 14:05) [10]
Я хочу сказать, что если тебе интересен этот вопрос, ты его можешь выяснить самостоятельно, используя указанные инструменты
← →
bss (2010-06-30 16:01) [12]вы меня переоцениваете ))
← →
Плохиш © (2010-06-30 16:25) [13]
> bss (30.06.10 16:01) [12]
>
> вы меня переоцениваете
А смысл тебе что-то объяснять? Тебе всё-равно не интересно.
← →
bss (2010-06-30 16:49) [14]да вообще нет смысла помогать людям в интернете. Какой в этом смысл?
← →
brother © (2010-07-01 07:27) [15]> да вообще нет смысла помогать людям в интернете. Какой в
> этом смысл?
смысл есть, но не имя базы, объяснения сводятся к цитированию учебников...
оно надо? почитай про tdump, и задавай конкретные вопросы.
← →
bss (2010-07-01 11:24) [16]
> смысл есть, но не имя базы
ну да, вопрос элементарнейший )) Думаю, большинство посещающих этот сайт людей не знает ответа на данный вопрос. И немалый процент тех, которые просто не смогут понять вопрос.
> почитай про tdump, и задавай конкретные вопросы
что мне про него читать. Список импорт/экспорт секций я и так смотрел неоднократно. А вот бегать по ассемблерному коду в отладчике - не хочется.
← →
Игорь Шевченко © (2010-07-01 11:37) [17]
> А вот бегать по ассемблерному коду в отладчике - не хочется
плати деньги тем, кто побегал
← →
bss (2010-07-01 12:03) [18]дык а чего вы сидите на форуме, где бесплатно отвечают? Идите на форум, где организованы платные ответы на вопросы.
← →
brother © (2010-07-01 12:04) [19]это ты кому сейчас?
← →
Anatoly Podgoretsky © (2010-07-01 12:22) [20]> bss (01.07.2010 12:03:18) [18]
Так это дело добровольное!!!
← →
Anatoly Podgoretsky © (2010-07-01 12:24) [21]
> да вообще нет смысла помогать людям в интернете. Какой в
> этом смысл?
Так нафига ты тогда сюда приперся? Мазохист? Или садист?
← →
Kerk © (2010-07-01 12:27) [22]
> bss
Забей на них.
:)
← →
Плохиш © (2010-07-01 15:07) [23]
> bss (01.07.10 12:03) [18]
>
> дык а чего вы сидите на форуме, где бесплатно отвечают?
Да мы и таких немощных уже видели.
Страницы: 1 вся ветка
Форум: "Прочее";
Текущий архив: 2010.09.26;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.003 c