Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.11.28;
Скачать: CL | DM;

Вниз

А может ли библиотека сама выгрузится?   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.03 c
3-1098737306
Sulimxar
2004-10-26 00:48
2004.11.28
DevExpress для Delphi 7


14-1100002724
ИМХО
2004-11-09 15:18
2004.11.28
В чем успех FAR-а и Total (Windows) Commander-а?


3-1098396246
Wint_
2004-10-22 02:04
2004.11.28
Нет коннекта с MySQL...


4-1097760226
Дядя
2004-10-14 17:23
2004.11.28
Срочно - надо заблокировать клаву и мышь, Но


14-1099969001
Думкин
2004-11-09 05:56
2004.11.28
С днем рождения! 9 ноября