Освобождение dll

Тема в разделе "WASM.BEGINNERS", создана пользователем 3DManiac, 24 июн 2006.

  1. 3DManiac

    3DManiac New Member

    Публикаций:
    0
    Регистрация:
    31 май 2006
    Сообщения:
    43
    Такой вот вопрос! Возможно ли освободить dll?



    вот такой код



    h = LoadLibrary 'kernel32.dll'

    createf = GetProcAddress h, 'CreateFile'

    exit = GetProcAddress h, 'ExitProcess'

    call createf

    call exit

    ---------------------------------------

    call FreeLibrary h - это сработает?
     
  2. 3DManiac

    3DManiac New Member

    Публикаций:
    0
    Регистрация:
    31 май 2006
    Сообщения:
    43
    а можно и вот так:



    h = LoadLibrary 'kernel32.dll'

    createf = GetProcAddress h, 'CreateFile'

    exit = GetProcAddress h, 'ExitProcess'

    call createf

    call FreeLibrary h

    ---------------------------------------

    call exit - но тогда это не выполнится
     
  3. 3DManiac

    3DManiac New Member

    Публикаций:
    0
    Регистрация:
    31 май 2006
    Сообщения:
    43
    Как освободить кернел?
     
  4. bsnake

    bsnake New Member

    Публикаций:
    0
    Регистрация:
    11 сен 2005
    Сообщения:
    91
    3DManiac

    А зачем так извращаться? В ExitProcess освобождаются все ресурсы, да и kernel32.dll автоматически подгружается при старте программы и всегда присутствует в адресном пространстве.
     
  5. 3DManiac

    3DManiac New Member

    Публикаций:
    0
    Регистрация:
    31 май 2006
    Сообщения:
    43
    bsnake

    прога на масме я просто структурированно описал суть проблемы.



    ( В ExitProcess освобождаются все ресурсы, да и kernel32.dll ) - что то я сомневаюсь. а зачем тогда FreeLibrary
     
  6. bsnake

    bsnake New Member

    Публикаций:
    0
    Регистрация:
    11 сен 2005
    Сообщения:
    91
    FreeLibrary только уменьшит счетчик ссылок на хендл, а выгрузится библиотека только когда он станет равным 0. Если бы в ExitProcess не освобождались все ресурсы, то были бы огромные утечки памяти из-за кривых программ, а таких очень много.
     
  7. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    3DManiac

    1) Интересно как ты собрался LoadLibrary вызывать, если она находится в kernel32 :)))

    2) bsnake все верно сказал. Добавлю только одно небольшое уточнение: kernel32 грузится в память в единственном экземпляре и при старте твоей проги она уже давно сидит в памяти, а в твой процесс она не "подгружается", а просто проецируется (если ты предствляешь, что такое трансляция страниц, то просто в PDE\PTE твоего процесса устанавливаются ссылки на физические страницы, в которых сидит kernel32)

    3) FreeLibrary нужна для выгрузки приватных dll, которые кроме как твоей проге больше никому не нужны - в этом случае они действительно могут быть выгружены из памяти. А kernel32 ес-но никуда не выгружается (разве что частично при нехватке физической памяти)