Динамическое связывание, выполняемое при загрузке


Когда система начинает программу, которая использует выполняемую при загрузке динамическую связь, используется информация помещенная в файл компоновщиком, чтобы определить местонахождение имен DLLs, которые используются процессом. Затем система определяет DLLs. Используемый порядок поиска зависит от значения ключа реестра

HKLM\System\CurrentControlSet\Control\Session Manager\SafeDllSearchMode

Windows 2000/NT, Windows Me/98/95: значение SafeDllSearchMode не существует.

Если SafeDllSearchMode равно 1 (это по умолчанию), порядок поиска происходит как указано ниже:

  1. Каталог из которого загружалось приложение.
  2. Системный каталог. Используйте функцию GetSystemDirectory, чтобы получить путь к этому каталогу.
  3. 16-разрядный системный каталог. Функции, которая получает путь к этому каталогу нет, но он ищется.  
    Windows Me/98/95:  
    Этот каталог не существует.
  4. Каталог Windows. Используйте функцию GetWindowsDirectory, чтобы получить путь к этому каталогу.
  5. Текущий каталог.
  6. Каталоги, которые внесены в список в переменной окружения PATH.

Если SafeDllSearchMode равно 0, порядок поиска происходит как указано ниже:

  1. Каталог из которого загружалось приложение.
  2. Текущий каталог.
  3. Системный каталог. Используйте функцию GetSystemDirectory, чтобы получить путь к этому каталогу.
  4. 16-разрядный системный каталог. Функции, которая получает путь к этому каталогу нет, но он ищется.  
    Windows Me/98/95:  
    Этот каталог не существует.
  5. Каталог Windows. Используйте функцию GetWindowsDirectory, чтобы получить путь к этому каталогу.
  6. Каталоги, которые внесены в список в переменной окружения PATH.
Windows XP:  Заданное по умолчанию значение HKLM\System\CurrentControlSet\Control\Session Manager\SafeDllSearchMode является 0 (текущий каталог ищется перед системным и  Windows каталогом).

Если система не может определить местонахождение требуемой DLL, она завершает работу процесса и показывает на экране диалоговое окно, которое сообщает пользователю об ошибке. В противном случае, система проецирует данные DLL в виртуальное адресное пространство процесса и увеличивает итоговое число ссылок на DLL.

Система вызывает функцию точки входа. Функция получает код, указывающий, что процесс загружает DLL. Если функция точки входа не возвращает значение ИСТИНА (TRUE), система завершает работу процесса и сообщает об ошибке. Дополнительную информацию о функции точки входа, см. в статье Функция точки входа динамически подключаемой библиотеки (DLL).

Наконец, система изменяет таблицу адресов функций стартовыми адресами импортируемых функций DLL.

DLL отображается в виртуальное адресное пространство процесса в ходе его инициализации и загружается в физическую память только тогда,  когда это необходимо.

Назад в оглавление
На главную страницу

Hosted by uCoz