Форум: "Потрепаться";
Текущий архив: 2004.11.28;
Скачать: [xml.tar.bz2];
ВнизА может ли библиотека сама выгрузится? Найти похожие ветки
← →
Piter © (2004-11-08 17:33) [0]Известно, что при вызове FreeLibrary библиотека выгружается из адресного пространства процесса, счетчик ее ссылок уменьшается на единицу, указатель на модуль становится недействительным. Но это со стороны процесса.
А может библиотка сама выгрузиться из адресного пространства какого-нибудь процесса?
Я знаю, что библиотека может не дать себя загрузить, вернув при загрузке в функции DllEntryPoint значение False. А вот если она уже загружена - может выгрузиться?
← →
DiamondShark © (2004-11-08 17:47) [1]А проверить?
← →
DiamondShark © (2004-11-08 17:51) [2]И, потом, что значит "сама выгрузиться"?
← →
DiamondShark © (2004-11-08 18:06) [3]Если под "сама выгрузиться" имеется в виду "код, исполняющий FreeLibrary располагается в библиотеке", то да. Такой код выгрузит библиотеку. Только любой код, исполняющийся после FreeLibrary (а такой код всегда будет, как минимум ret), вызовет access violation.
← →
VMcL © (2004-11-08 18:33) [4]>>Piter © (08.11.04 17:33)
См. FreeLibraryAndExitThread()
← →
Piter © (2004-11-08 18:34) [5]DiamondShark © (08.11.04 18:06) [3]
а такой код всегда будет, как минимум ret
То есть, допустим, я загрузил библиотеку. Обращаюсь к какой-то ее функции, а эта функция проверяет "внутри" какого собственно процесса она находится и если ей что-то не понравится - то она вызывает FreeLibrary со своим Instance? Тогда библиотека выгружается? А почему произойдет AV? Что за ret?
И еще интересно - а как библиотека может узнать свой instance? Насколько я знаю GetModuleHandle(nil) внутри библиотеки приведет к возврату указателя на образ EXE, а не этой DLL
← →
VMcL © (2004-11-08 18:35) [6]>>Piter © (08.11.04 18:34) [5]
>И еще интересно - а как библиотека может узнать свой instance?
А что System.HInstance отменили?
← →
DiamondShark © (2004-11-08 18:43) [7]
> Piter © (08.11.04 18:34) [5]
> То есть, допустим, я загрузил библиотеку. Обращаюсь к какой-то
> ее функции, а эта функция проверяет "внутри" какого собственно
> процесса она находится и если ей что-то не понравится -
> то она вызывает FreeLibrary со своим Instance?
А... эээ... Это ко мне вопрос или мысли вслух?
> Тогда библиотека выгружается?
Если вызывается FreeLibrary и счётчик загрузок нулевой, то библиотека выгрузится.
> А почему произойдет AV?
Потому что страницы, в которых размещался код библиотеки будут освобождены.
> Что за ret?
Инструкция возврата из процедуры.
← →
DiamondShark © (2004-11-08 18:53) [8]
> А что System.HInstance отменили?
<flame>
По последним слухам она SysInit.HInstance
</flame>
:)
> И еще интересно - а как библиотека может узнать свой instance?
HInstance библиотеки передаётся в DllEntryPoint при загрузке библиотеки.
В Дельфи код инициализации (модуль SysInit) сохраняет его в глобальной переменной.
← →
VMcL © (2004-11-08 19:07) [9]>>DiamondShark © (08.11.04 18:53) [8]
>По последним слухам она SysInit.HInstance
Приду домой - провер (на работе D нету)
:-)
← →
Piter © (2004-11-08 19:36) [10]VMcL © (08.11.04 18:33) [4]
См. FreeLibraryAndExitThread()
то есть, библиотека может сама корректно выгрузиться только вместе с завершением потока, который вызвал какую-нибудь функцию этой библиотеки?
VMcL © (08.11.04 18:35) [6]
А что System.HInstance отменили?
не знаю как насчет отмены, но никакого System.HInstance я найти не могу...
А вот еще что мне интересно. Есть допустим функция SetTimer, создающая таймер. В документации написано, что событие таймера (вызов TimerProc функции) возникает когда поток вызывает DispatchMessage. Допустим, функцию библиотеки вызвал какой-то поток. Эта функция тоже будет отрабатывать в контексте этого потока, верно? А если библиотека при этом создает таймер, то значит он создается в контексте потока, вызвавшего функцию библиотеки?
Получается, событие таймера таймера будет происходить тогда, когда поток, вызвавший функцию библиотеки, будет делать выборку сообщений и вызывать DispatchMessage?
А если поток, вызвавший функцию библиотеки, не имеет окон и вообще не делает выборку сообщений - то таймер, созданный в библиотеке, не будет работать?
И еще такой вопрос - а в контексте какого потока исполняется код библиотеки, когда она только загружается первый раз в память, ну в Дельфи это код между главными begin..end:library Project1;
uses
SysUtils,
Classes;
{$R *.res}
begin
// в контексте какого потока исполняется данный код?
end.
Ну и совсем последний вопрос, если позволите.
А если один и тот же процесс вызывает два раза LoadLibrary для одной и той же библиотеки - что произойдет? Она будет вторично загружена? Счетчик ссылок на нее увеличится?
← →
Piter © (2004-11-08 19:37) [11]DiamondShark © (08.11.04 18:43) [7]
... эээ... Это ко мне вопрос или мысли вслух?
это вопрос... ко всем. В том числе и к тебе :)
← →
Piter © (2004-11-08 19:38) [12]DiamondShark © (08.11.04 18:53) [8]
HInstance библиотеки передаётся в DllEntryPoint при загрузке библиотеки
кем передается? Виндой?
← →
DiamondShark © (2004-11-08 19:48) [13]
> Piter © (08.11.04 19:36) [10]
> то есть, библиотека может сама корректно выгрузиться только
> вместе с завершением потока, который вызвал какую-нибудь
> функцию этой библиотеки?
Если код, который вызвал выгрузку библиотеки, находится в самой этотй библиотеке, то да. Потому что выгрузка библиотеки разрушает этот самый код.
> И еще такой вопрос - а в контексте какого потока исполняется
> код библиотеки, когда она только загружается первый раз
> в память
Ну написано же в справке.
В контексте потока, вызвавшего LoadLibrary.
> А если один и тот же процесс вызывает два раза LoadLibrary
> для одной и той же библиотеки - что произойдет? Она будет
> вторично загружена? Счетчик ссылок на нее увеличится?
Видимого ничего не произойдёт. Увеличится внутренний счётчик.
> Piter © (08.11.04 19:38) [12]
> HInstance библиотеки передаётся в DllEntryPoint при загрузке
> библиотеки
>
> кем передается? Виндой?
Да. Точка входа библиотеки -- функция вида
BOOL WINAPI DllEntryPoint(
HINSTANCE hinstDLL, // handle to DLL module
DWORD fdwReason, // reason for calling function
LPVOID lpvReserved // reserved
);
← →
VMcL © (2004-11-08 21:04) [14]>>DiamondShark © (08.11.04 18:53) [8]
>>VMcL © (08.11.04 19:07) [9]
Проверил (D6). В натуре :-)
Страницы: 1 вся ветка
Форум: "Потрепаться";
Текущий архив: 2004.11.28;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.033 c