Функция LoadLibraryEx


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

Синтаксис

HMODULE LoadLibraryEx(
  LPCTSTR lpFileName,
  HANDLE hFile,
  DWORD dwFlags
);

Параметры

lpFileName

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

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

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

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

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

hFile

Этот параметр резервируется для будущего использования. Он должен быть ПУСТО (NULL).

dwFlags

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

 

Значение Предназначение
DONT_RESOLVE_DLL_REFERENCES Если это значение используется и исполняемый модуль - DLL, система не вызывает DllMain для  инициализации и завершения работы процесса и потока. Также, система не загружает дополнительные исполняемые модули, на которые ссылается указанный модуль.

Если Вы планируете только доступ к данным  или ресурсам в DLL, лучше использовать LOAD_LIBRARY_AS_DATAFILE.

Windows Me/98/95:  Это значение не поддерживается.
LOAD_IGNORE_CODE_AUTHZ_LEVEL Если это значение используется, система не не осуществляет автоматические трастовые сравнения на DLL или ее иждивенцах, когда они загружены.

Windows 2000/NT, Windows Me/98/95:  Это значение не поддерживается.

LOAD_LIBRARY_AS_DATAFILE Если это значение используется, система преобразует и проецирует данные файла в виртуальное адресное пространство вызывающего процесса, так, как если бы он был файлом данных. Ничего не делается, чтобы исполнить код или подготовиться к исполнению отображаемого файла. Поэтому, Вы не можете вызывать функции подобно GetModuleHandle или GetProcAddress для этой DLL. Используйте этот флажок тогда, когда  хотите загрузить DLL только для того, чтобы извлечь сообщения или ресурсы из нее.

Windows Me/98/95:  Вы можете использовать дескриптор получаемого  модуля только с функциями управления ресурсом  типа  EnumResourceLanguages, EnumResourceNames, EnumResourceTypes, FindResource, FindResourceEx, LoadResource и SizeofResource. Вы не можете использовать этот дескриптор со специализированными функциями управления ресурсом такими как LoadBitmap, LoadCursor, LoadIcon, LoadImage и LoadMenu.

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

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

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

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

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

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

Замечания

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

Вызывающий процесс может использовать дескриптор, возвращенный этой функцией, чтобы идентифицировать модуль при вызове функции GetProcAddress, FindResource и  LoadResource.

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

Функция LoadLibraryEx является очень похожей на функцию LoadLibrary. Различия состоят из установки дополнительных режимов работы, которые обеспечивает LoadLibraryEx. Во-первых, LoadLibraryEx может проецировать модуль DLL, не вызывая функцию DllMain в DLL. Во вторых, LoadLibraryEx может использовать любую из двух стратегий поиска файла исполняемого модуля, которые связаны с указанным модулем. В-третьих, LoadLibraryEx может загрузить модуль способом, который оптимизирован для ситуации, когда модуль никогда не будет исполняться, загружая модуль, как если бы он был файлом данных. Вы выбираете эти дополнительные режимы работы, устанавливая параметр dwFlags; если dwFlags равняется нулю, LoadLibraryEx ведет себя тождественно  LoadLibrary.

Вызов LoadLibraryEx из DllMain не сохраняется. Дополнительную информацию, см. разделе Замечаний в DllMain.

Функция LoadLibraryEx осуществляет стандартный поиск модулей, если имя файла определяется без пути, а базовое имя файла не соответствует базовому имени файла загруженного модуля, или путь есть, но LOAD_WITH_ALTERED_SEARCH_PATH не используется. Используемый порядок поиска зависит от настройки значения 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 каталогом).

Если путь определяется, а dwFlags устанавливается в LOAD_WITH_ALTERED_SEARCH_PATH, функция LoadLibraryEx использует дополнительную стратегию поиска файла. Используемый порядок поиска зависит от настройки значения HKLM\System\CurrentControlSet\Control\Session Manager\SafeDllSearchMode.

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

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

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

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

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

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

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

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

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

Код примера

Пример, см. в статье Поиск текста для чисел кодов ошибок.

Смотри также

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

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

К

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

Реализовано как LoadLibraryExW(Unicode) и LoadLibraryExA(ANSI).

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

Не имеется

 

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

Hosted by uCoz