Библиотека динамических ссылок (DLL) в Windows работает благодаря динамическому связыванию. 12 В отличие от статической компоновки, при которой компоновщик копирует код функции библиотеки в каждый вызывающий модуль, при динамическом связывании общий код помещается в один отдельный файл. 12
Существует два метода вызова функции в библиотеке DLL: 2
- Динамическое связывание во время загрузки. 2 Модуль выполняет явные вызовы экспортированных функций DLL, как если бы они были локальными функциями. 2 Для этого требуется связать модуль с библиотекой импорта для библиотеки DLL, содержащей функции. 2 Библиотека импорта предоставляет системе сведения, необходимые для загрузки библиотеки DLL и поиска экспортированных функций DLL при загрузке приложения. 2
- Динамическое связывание во время выполнения. 2 Модуль использует функцию LoadLibrary или LoadLibraryEx для загрузки библиотеки DLL во время выполнения. 2 После загрузки библиотеки DLL модуль вызывает функцию GetProcAddress, чтобы получить адреса экспортированных функций DLL. 2 Модуль вызывает экспортированные функции DLL с помощью указателей функций, возвращаемых GetProcAddress. 2
Некоторые особенности работы DLL-библиотек:
- Каждый процесс, который загружает библиотеку DLL, отображает её в своё виртуальное адресное пространство. 2
- Система ведёт учёт ссылок для каждой DLL по каждому процессу. 2 Когда поток загружает библиотеку DLL, счётчик ссылок увеличивается на единицу. 2
- Когда процесс завершается или когда число ссылок становится нулевым (только динамическое связывание во время выполнения), библиотека DLL выгружается из виртуального адресного пространства процесса. 2