Функция 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 или Юникод этой функции на основе определения константы препроцессора ЮНИКОДа. Сочетание использования псевдонима, нейтрального для кодирования, с кодом, не зависящим от кодирования, может привести к несоответствиям, которые приводят к ошибкам компиляции или среды выполнения. Дополнительные сведения см. в соглашениях о прототипах функций.
Требования
Требование | Ценность |
---|---|
минимальные поддерживаемые клиентские | Windows XP [только классические приложения] |
минимальный поддерживаемый сервер | Windows Server 2003 [только классические приложения] |
целевая платформа | Виндоус |
заголовка | libloaderapi.h (включая Windows.h) |
библиотеки |
Kernel32.lib |
DLL | Kernel32.dll |
См. также
Функции библиотеки Dynamic-Link