logo
АВМиС - бывшее АПЭВМ / apvem / всякаявсячина

46. Библиотеки dll

Функции DLL пишутся в расчете на то, что их будет вызывать какое-то приложение (ЕХЕ- файл) или другая DLL. Чтобы приложение (или другая DLL) могло вызывать функции из DLL, исполняемый файл нужно сначала спроецировать на адресное пространство вызывающего процесса. Это делается либо неявной компоновкой при загрузке, либо явной — в период выполнения. Как только DLL спроецирована на адресное пространство вызывающего процесса, ее функции доступны всем потокам этого процесса. Фактически библиотеки при этом теряют почти всю индивидуальность: для потоков код и данные DLL — просто дополнительный код и данные, оказавшиеся в адресном пространстве процесса. Когда поток вызывает из DLL какую-то функцию, та считывает свои параметры из стека потока и размещает в этом стеке собственные локальные переменные. Кроме того, любые созданные кодом DLL объекты принадлежат вызывающему потоку или процессу — DLL в Win32 ничем не владеет.

Неявная компоновка(implicit linking) — самый распространенный метод проецирования образа DLL-файла на адресное пространство процесса. При сборке приложения компонов­щику нужно указать набор LIB-файлов. Каждый такой файл содержит список функций данной DLL, вызов которых разрешен приложениям (или другой DLL). Обнаружив, что приложение ссылается на функции, упомянутые в LIB-файле для DLL, компоновщик вне­дряет имя этой DLL в конечный исполняемый файл. При загрузке ЕХЕ - файла система про­сматривает его образ на предмет определения необходимых ему DLL, после чего пытается спроецировать их на адресное пространство процесса. Поиск DLL осуществляется в :

1. каталоге, содержащем ЕХЕ - файл;

2. текущем каталоге процесса;

3. системном каталоге Windows;

4. основном каталоге Windows;

5. каталогах, указанных в переменной окружения PATH.

Если файл DLL не найден, система открывает окно с сообщением и немедленно завершает процесс.

Библиотеки, спроецированные на адресное пространство этим методом, не отключаются от него до завершения процесса.