ilyachalov (ilyachalov) wrote,
ilyachalov
ilyachalov

Categories:

О динамически подключаемых библиотеках подробнее

Начало в посте «Динамически подключаемые библиотеки».

Перевод с английского статьи от 31.05.2018 г. «About Dynamic-Link Libraries»:
https://docs.microsoft.com/ru-ru/windows/win32/dlls/about-dynamic-link-libraries
(На данный момент на этом сайте нет перевода этой статьи на русский, есть только версия на английском.)

Динамическое связывание делает возможной ситуацию, в которой модуль включает только информацию, необходимую для определения местонахождения экспортируемой функции DLL во время запуска программы [load time] или во время выполнения программы [run time]. Динамическое связывание отличается от более известного статического связывания [имеются в виду статические библиотеки функций или классов], при котором компоновщик [linker] копирует код библиотечной функции в каждый модуль, из которого эта функция вызывается.

Виды динамического связывания

Есть два метода вызова [из нашей программы] функции [содержащейся] в DLL:

  • при динамическом связывании во время запуска программы: модуль может выполнять явные вызовы экспортируемых функций DLL таким образом, как если бы они были локальными [собственными] функциями модуля. Этот способ требует от нас компоновки модуля с библиотекой импорта для DLL, содержащей нужные функции. Библиотека импорта дает [операционной] системе информацию, нужную для загрузки DLL и нахождения экспортируемых функций DLL, когда приложение загружается;

  • при динамическом связывании во время выполнения программы: модуль должен использовать функции [из набора Windows API] LoadLibrary или LoadLibraryEx, чтобы загрузить нужную DLL во время своего выполнения. После того, как DLL загружена [в оперативную память], модуль должен вызвать функцию [из набора Windows API] GetProcAddress, чтобы получить адреса экспортируемых функций DLL. Модуль может вызвать экспортируемые функции DLL, использовав указатели, возвращенные функцией GetProcAddress. Такой подход устраняет необходимость в библиотеке импорта.

Библиотеки DLL и управление памятью

Каждый процесс, который загружает DLL, отображает ее в своё виртуальное адресное пространство. После этого процесс может вызывать экспортируемые функции DLL.

Операционная система ведет в разрезе процессов счетчик ссылок по каждой DLL. Когда поток выполнения [thread] загружает DLL, счетчик ссылок увеличивается на единицу. Когда процесс завершается или когда счетчик ссылок становится равен нулю (только при динамическом связывании во время выполнения программы), DLL выгружается из виртуального адресного пространства процесса.

Как и любая другая функция, экспортируемая функция DLL запускается в контексте потока выполнения, который ее вызвал. Поэтому верно следующее:

  • потоки выполнения процесса, вызвавшие DLL, могут использовать дескрипторы [handle], открытые функцией DLL. Так же, как и дескрипторы, открытые любым потоком выполнения вызывающего процесса, могут использоваться в функции DLL;

  • DLL использует стек вызывающего потока выполнения и виртуальное адресное пространство вызывающего процесса;

  • DLL резервирует память из виртуального адресного пространства вызывающего процесса.

Tags: Английский язык, Образование, Программирование
Subscribe

Recent Posts from This Journal

  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your IP address will be recorded 

  • 0 comments