Функция LoadLibrary


Функция LoadLibrary отображает заданный исполняемый модуль в адресное пространство вызывающего процесса.

Чтобы загрузить дополнительные параметры, используйте функцию LoadLibraryEx.

Синтаксис

HMODULE LoadLibrary(
  LPCTSTR lpFileName
);

Параметры

lpFileName

[in] Указатель на символьную строку с нулем в конце, которая именует исполняемый модуль (или  .dll или .exe файл). Указанное имя -  это имя файла модуля и оно не связано с именем самого сохраняемого в библиотеке модуля, как это определено ключевым словом LIBRARY в (.def) файле определения модуля.

Если  строка определяет путь, но файл не существует в указанном каталоге, функция завершается ошибкой. Когда определяется путь, убедитесь, что использованы наклонные черты влево(обратные слэши (\)), а не прямые слэши (/).

Если символьная строка не определяет путь, функция использует стандартную стратегию поиска файла. Дополнительную информацию см. в разделе Замечания.

Возвращаемые значения

Если функция завершается успешно, возвращаемое значение - дескриптор модуля.

Если функция завершается ошибкой, возвращаемое значение - ПУСТО (NULL). Чтобы получить дополнительную информацию об ошибке, вызовите GetLastError.

Windows Me/98/95:  Если Вы используете LoadLibrary, чтобы загрузить модуль, который содержит ресурс, числовой идентификатор которого больше, чем 0x7FFF, LoadLibrary завершается ошибкой. Если Вы пытаетесь загрузить 16-разрядную DLL непосредственно из 32-разрядного кода, LoadLibrary завершается ошибкой. Если Вы пытаетесь загрузить DLL, подсистемная версия которой больше чем 4.0, LoadLibrary завершается ошибкой. Если ваша функция DllMain пробует вызывать, Unicode версию функции, LoadLibrary завершается ошибкой. 

Замечания

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

LoadLibrary может быть использована чтобы отобразить модуль DLL и возвратить дескриптор, который может использоваться в функции GetProcAddress, чтобы получить адрес функции  DLL. LoadLibrary может также использоваться, чтобы проецировать другие исполняемые модули. Например, функция может определить .exe файл, чтобы получить дескриптор, который может быть использован в функциях FindResource или LoadResource. Однако, не используйте LoadLibrary, чтобы запустить .exe файл, использующий функцию CreateProcess.

Если модуль - DLL, еще не отображенная для вызывающего процесса, система вызывает функцию DllMain DLL со значением DLL_PROCESS_ATTACH. Если DllMain возвращает значение ИСТИНА (TRUE), LoadLibrary возвращается успешно. Если DllMain возвращает значение ЛОЖЬ (FALSE), система выгружает DLL из адресного пространства процесса, а LoadLibrary возвращает значение ПУСТО (NULL).

 Вызов LoadLibrary из DllMain - не безопасен. Дополнительную информацию смотри в описании функции DllMain в разделе Замечания.

Дескрипторы модуля - не глобальные или наследуемые. Вызов LoadLibrary  одним процессом не создает дескриптор, который другой процесс может использовать - например, в вызове функции GetProcAddress. Другой процесс должен сделать свой собственный вызов LoadLibrary для модуля перед вызовом GetProcAddress.

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

Если расширение имени файла в параметре lpFileName не определено, в конец добавляется заданное по умолчанию библиотечное расширение .dll. Однако, символьная строка имени файла может включать в себя конечный символ точки (.), который указывает, что имя модуля не имеет расширения. Когда определяется путь, функция ищет загруженные модули,  базовое имя которых соответствует базовому имени модуля, который загружается. Если имя соответствует, загрузка завершается успешно. В противном случае функция ищет файл. Порядок поиска используется в зависимости от установленного значения в 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 каталогом).

Первый найденный каталог - это каталог, содержащий загрузочный модуль (PE-файл), используемый, чтобы создать вызывающий процесс (дополнительную информацию смотри в описании функции CreateProcess). Такое выполнение дает возможность файлы отдельных динамически подключаемых библиотек (DLL), для поиска связать с процессом, не добавляя установленный каталог процесса в переменную окружения PATH.

Путь поиска может быть изменен использованием функция SetDllDirectory. Этот метод решения рекомендуется вместо того, чтобы использовать SetCurrentDirectory или жесткое кодирование полного пути к DLL.

Если путь определяется и есть файл переназначения для приложения,  функция ищет модули в каталоге приложения. Если модуль в каталоге приложения существует, LoadLibrary игнорирует заданный путь и загружает модуль из каталога прикладной программы. Если модуль в каталоге прикладной программы не существует, LoadLibrary загружает модуль из указанного каталога. Дополнительную информацию, см. в статье Переназначение динамически загружаемой библиотеки.

Если Вы вызываете LoadLibrary с именем блока без определения пути, а блок внесен в список в системную декларацию совместимости, вызов автоматически переадресуется в параллельный блок.

Компилятор Visual C++ поддерживает синтаксис, который дает возможность Вам, чтобы объявить локальные для потока переменные: _declspec (thread). Если Вы используете этот синтаксис в DLL, то будете не в состоянии загрузить DLL, явно используя LoadLibrary или LoadLibraryEx. Если ваша DLL, должна быть загружена явно, Вы должны использовать функции локальной памяти потока (TLS) вместо _declspec (thread).

Код примера

Пример, см. в статье Использование динамического связывания периода выполнения.

Смотри также

Обзор Динамически подключаемые библиотеки (DLL), Функции, используемые DLLDllMain, FindResource, FreeLibrary, GetProcAddress, GetSystemDirectoryGetWindowsDirectory, LoadLibraryExLoadResource, SetDllDirectory, SetErrorMode

Размещение и совместимость LoadLibrary

К

Windows XP

Да 

л

Windows 2000 Professional

Да

и

Windows NT  Workstation

Да 

е

Windows Me

Да

н

Windows 98

Да

т

Windows 95

Да

 
С

Windows Server 2003

Да

е Windows 2000 Server Да
р Windows NT Server Да  
в    
е    
р    

Используемая библиотека

Kernel32.lib

Используемая DLL kernel32.dll
 Заголовочный файл  

- объявлено в

Winbase.h

 - включено в

Windows.h

 Unicode

Реализовано как LoadLibraryW(Unicode) и LoadLibraryA(ANSI).

 Замечания по платформе

Не имеется

 

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

Hosted by uCoz