Такой вот вопрос! Возможно ли освободить dll? вот такой код h = LoadLibrary 'kernel32.dll' createf = GetProcAddress h, 'CreateFile' exit = GetProcAddress h, 'ExitProcess' call createf call exit --------------------------------------- call FreeLibrary h - это сработает?
а можно и вот так: h = LoadLibrary 'kernel32.dll' createf = GetProcAddress h, 'CreateFile' exit = GetProcAddress h, 'ExitProcess' call createf call FreeLibrary h --------------------------------------- call exit - но тогда это не выполнится
3DManiac А зачем так извращаться? В ExitProcess освобождаются все ресурсы, да и kernel32.dll автоматически подгружается при старте программы и всегда присутствует в адресном пространстве.
bsnake прога на масме я просто структурированно описал суть проблемы. ( В ExitProcess освобождаются все ресурсы, да и kernel32.dll ) - что то я сомневаюсь. а зачем тогда FreeLibrary
FreeLibrary только уменьшит счетчик ссылок на хендл, а выгрузится библиотека только когда он станет равным 0. Если бы в ExitProcess не освобождались все ресурсы, то были бы огромные утечки памяти из-за кривых программ, а таких очень много.
3DManiac 1) Интересно как ты собрался LoadLibrary вызывать, если она находится в kernel32 )) 2) bsnake все верно сказал. Добавлю только одно небольшое уточнение: kernel32 грузится в память в единственном экземпляре и при старте твоей проги она уже давно сидит в памяти, а в твой процесс она не "подгружается", а просто проецируется (если ты предствляешь, что такое трансляция страниц, то просто в PDE\PTE твоего процесса устанавливаются ссылки на физические страницы, в которых сидит kernel32) 3) FreeLibrary нужна для выгрузки приватных dll, которые кроме как твоей проге больше никому не нужны - в этом случае они действительно могут быть выгружены из памяти. А kernel32 ес-но никуда не выгружается (разве что частично при нехватке физической памяти)