Функция 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 (это по умолчанию), порядок поиска происходит как указано ниже:
Если SafeDllSearchMode равно 0, порядок поиска происходит как указано ниже:
Если путь определяется, а dwFlags устанавливается в LOAD_WITH_ALTERED_SEARCH_PATH, функция LoadLibraryEx использует дополнительную стратегию поиска файла. Используемый порядок поиска зависит от настройки значения HKLM\System\CurrentControlSet\Control\Session Manager\SafeDllSearchMode.
Если SafeDllSearchMode равно 1, порядок альтернативный поиск происходит как указано ниже:
Если SafeDllSearchMode равно 0, порядок дополнительного поиска происходит как указано ниже:
Обратите внимание! на то, что стандартная и дополнительная стратегия поиска отличаются только одним вариантом: стандартный поиск начинается в каталоге вызывающей программы, а дополнительный поиск начинается в каталоге исполняемого модуля, который загружает LoadLibraryEx. |
Если Вы определяете дополнительную стратегию поиска, ее режим работы продолжается до тех пор, пока все связанные исполняемые модули не будут размещены. После того, как система начинает обрабатывать процедуры инициализации DLL, система возвращается к стандартной стратегии поиска.
Путь поиска может быть изменен использованием функции SetDllDirectory. Этот метод решения рекомендуется вместо того, чтобы использовать функцию SetCurrentDirectory или жесткое кодирование полного пути к DLL.
Если путь определяется и есть файл переназначения, связанный с приложением, функции LoadLibraryEx ищет модули в каталоге прикладной программы. Если модуль в каталоге приложения существует, LoadLibraryEx игнорирует определение пути и загружает модуль из каталога приложения. Если модуль в каталоге приложения не существует, функция загружает модуль из указанного каталога. Дополнительную информацию, см. в статье Переназначение динамически загружаемой библиотеки.
Если Вы вызываете LoadLibrary с именем блока без определения пути, а блок внесен в список в системную декларацию совместимости, вызов автоматически переадресуется в параллельный блок.
Компилятор Visual C++ поддерживает синтаксис, который дает возможность Вам, чтобы объявить локальные для потока переменные: _declspec (thread). Если Вы используете этот синтаксис в DLL, то будете не в состоянии загрузить DLL, явно используя LoadLibrary или LoadLibraryEx. Если ваша DLL, должна быть загружена явно, Вы должны использовать функции локальной памяти потока (TLS) вместо _declspec (thread).
Код примера
Пример, см. в статье Поиск текста для чисел кодов ошибок.
Смотри также
Обзор Динамически подключаемые библиотеки (DLL), Функции, используемые DLL, DllMain, FindResource, FreeLibrary, GetProcAddress, GetSystemDirectory, GetWindowsDirectory, LoadLibrary, LoadResource, 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). |
|
Замечания по платформе |
Не имеется |