Функция GetModuleHandleW (libloaderapi.h)
Извлекает дескриптор модуля для указанного модуля. Модуль должен быть загружен вызывающим процессом.
Чтобы избежать условий гонки, описанных в разделе Примечания, используйте функцию GetModuleHandleEx .
Синтаксис
HMODULE GetModuleHandleW(
[in, optional] LPCWSTR lpModuleName
);
Параметры
[in, optional] lpModuleName
Имя загруженного модуля (файл .dll или .exe). Если расширение имени файла опущено, добавляется расширение библиотеки по умолчанию .dll. Строка имени файла может содержать символ конечной точки (.), чтобы указать, что имя модуля не имеет расширения. В строке не нужно указывать путь. При указании пути обязательно используйте обратную косую черту (\), а не косую черту (/). Имя сравнивается (независимо от регистра) с именами модулей, которые в настоящее время сопоставлены с адресным пространством вызывающего процесса.
Если этот параметр имеет значение NULL, GetModuleHandle возвращает дескриптор файла, используемого для создания вызывающего процесса (.exe файл).
Функция GetModuleHandle не извлекает дескрипторы для модулей, загруженных с помощью флага LOAD_LIBRARY_AS_DATAFILE . Дополнительные сведения см. в разделе LoadLibraryEx.
Возвращаемое значение
Если функция выполняется успешно, возвращается дескриптор указанного модуля.
Если функция завершается сбоем, возвращается значение NULL. Дополнительные сведения об ошибке можно получить, вызвав GetLastError.
Комментарии
Возвращенный дескриптор не является глобальным или наследуемым. Его нельзя дублировать или использовать другим процессом.
Если lpModuleName не содержит пути и есть несколько загруженных модулей с одинаковыми базовыми именами и расширением, невозможно предсказать, какой дескриптор модуля будет возвращен. Чтобы обойти эту проблему, можно указать путь, использовать параллельные сборки или использовать GetModuleHandleEx , чтобы указать расположение памяти, а не имя библиотеки DLL.
Функция GetModuleHandle возвращает дескриптор сопоставленного модуля без увеличения числа ссылок. Однако если этот дескриптор передается функции FreeLibrary , количество ссылок сопоставленного модуля будет уменьшено. Поэтому не передайте дескриптор, возвращенный GetModuleHandle , в функцию FreeLibrary . Это может привести к преждевременному распаку модуля DLL.
Эту функцию необходимо тщательно использовать в многопоточных приложениях. Нет гарантии, что дескриптор модуля остается действительным между временем, когда эта функция возвращает дескриптор и время его использования. Например, предположим, что поток получает дескриптор модуля, но перед использованием дескриптора второй поток освобождает модуль. Если система загружает другой модуль, она может повторно использовать дескриптор модуля, который был недавно освобожден. Таким образом, первый поток будет иметь дескриптор модуля, отличного от предполагаемого.
Примеры
Пример см . в разделе Использование кистей.
Примечание
Заголовок libloaderapi.h определяет GetModuleHandle как псевдоним, который автоматически выбирает версию ANSI или Юникод этой функции на основе определения константы препроцессора UNICODE. Сочетание использования псевдонима, не зависящий от кодировки, с кодом, не зависящим от кодировки, может привести к несоответствиям, которые приводят к ошибкам компиляции или среды выполнения. Дополнительные сведения см. в разделе Соглашения для прототипов функций.
Требования
Минимальная версия клиента | Windows XP [только классические приложения] |
Минимальная версия сервера | Windows Server 2003 [только классические приложения] |
Целевая платформа | Windows |
Header | libloaderapi.h (включая Windows.h) |
Библиотека | Kernel32.lib |
DLL | Kernel32.dll |