Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 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
4-1097859065
GanibalLector
2004-10-15 20:51
2004.11.28
GetDiskFreeSpace


3-1098946570
Jungle
2004-10-28 10:56
2004.11.28
Проблема с подключением к SQL Server 2000


6-1095602469
shuraspb
2004-09-19 18:01
2004.11.28
PortMapping с логом обращений


14-1099310768
DeMoN-777
2004-11-01 15:06
2004.11.28
Wireless


6-1095776242
Лев Ландау
2004-09-21 18:17
2004.11.28
}|{ажда знаний ( IdHTTP or IdTCPClient )





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский