Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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.004 c
15-1277763229
AlexDn
2010-06-29 02:13
2010.09.26
Еще один вопрос по Inno Setup


2-1277807207
mefodiy
2010-06-29 14:26
2010.09.26
Настройки Дельфи при смене учетной записи


2-1277877991
AK-47
2010-06-30 10:06
2010.09.26
Конвертация из *.docx в *.doc


2-1278004485
faiwer
2010-07-01 21:14
2010.09.26
Игнорирование ошибки


15-1277965959
MonoLife
2010-07-01 10:32
2010.09.26
Рабочий вопрос.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский