Сведения о библиотеках Dynamic-Link
Динамическое связывание позволяет модулю включать только сведения, необходимые для поиска экспортируемой функции DLL во время загрузки или во время выполнения. Динамическое связывание отличается от более знакомой статической компоновки, в которой компоновщик копирует код функции библиотеки в каждый модуль, вызывающий его.
Типы динамической компоновки
Существует два метода вызова функции в библиотеке DLL:
- В динамическом связывании во время загрузкимодуль выполняет явные вызовы экспортированных функций DLL, как если бы они были локальными функциями. Для этого требуется связать модуль с библиотекой импорта для библиотеки DLL, содержащей функции. Библиотека импорта предоставляет системе сведения, необходимые для загрузки библиотеки DLL и поиска экспортированных функций DLL при загрузке приложения.
- В динамическое связывание во время выполнениямодуль использует функцию LoadLibrary или LoadLibraryEx для загрузки библиотеки DLL во время выполнения. После загрузки библиотеки DLL модуль вызывает функцию GetProcAddress, чтобы получить адреса экспортированных функций DLL. Модуль вызывает экспортированные функции DLL с помощью указателей функций, возвращаемых GetProcAddress. Это устраняет необходимость в библиотеке импорта.
Библиотеки DLL и управление памятью
Каждый процесс, который загружает библиотеку DLL, отображает её в свое виртуальное адресное пространство. После того как процесс загружает библиотеку DLL в свой виртуальный адрес, он может вызвать экспортированные функции DLL.
Система ведет учет ссылок для каждой DLL по каждому процессу. Когда поток загружает библиотеку DLL, счётчик ссылок увеличивается на единицу. Когда процесс завершается или когда число ссылок становится нулевым (только динамическое связывание во время выполнения), библиотека DLL выгружается из виртуального адресного пространства процесса.
Как и любая другая функция, экспортируемая функция DLL выполняется в контексте потока, вызывающего его. Поэтому применяются следующие условия:
- Потоки процесса, вызывающего библиотеку DLL, могут использовать дескрипторы, открытые функцией DLL. Аналогичным образом дескрипторы, открытые любым потоком вызывающего процесса, можно использовать в функции DLL.
- Библиотека DLL использует стек вызывающего потока и виртуальное адресное пространство вызывающего процесса.
- Библиотека DLL выделяет память из виртуального адресного пространства вызывающего процесса.
Дополнительные сведения о библиотеках DLL см. в следующих разделах:
- Преимущества динамического связывания
- Dynamic-Link создание библиотеки
- Dynamic-Link библиотека Entry-Point Функция
- Load-Time динамическое связывание
- Run-Time динамическое связывание
- Dynamic-Link порядок поиска библиотеки
- Dynamic-Link данные библиотеки
- Dynamic-Link Перенаправление библиотеки
- обновления библиотеки Dynamic-Link
- Dynamic-Link Безопасность библиотеки
- DLL AppInit и Безопасная загрузка