Сведения о библиотеках 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 см. в следующих разделах: