Функция GetModuleHandle извлекает дескриптор указанного модуля, если файл был отображен в адресном пространстве вызывающего процесса.
Чтобы избежать состояний гонки, описанных в разделе Замечаний, используйте функцию GetModuleHandleEx.
Синтаксис
HMODULE GetModuleHandle( LPCTSTR lpModuleName); |
Параметры
lpModuleName
[in] Указатель на символьную строку с нулем в конце, которая содержит имя модули (или .dll или .exe файл). Если расширение имени файла опускается, в конец добавляется заданное по умолчанию библиотечное расширение .dll. Символьная строка имени файла может включать в себя конечный символ точки (.), который указывает, что имя модуля не имеет расширения. Строка не должна определять путь. Когда определяется путь, убедитесь, что используются обратные слэши (\), а не прямые слэши (/). Имя сравнивается (независимо от ситуации) с именами модулей в текущий момент отображаемыми в адресном пространстве вызывающего процесса.Если этот параметр - NULL, GetModuleHandle возвращает дескриптор файла, используемый, чтобы создать вызывающий процесс (.exe файл).
Возвращаемые значения
Если функция завершается успешно, возвращаемое значение - дескриптор указанного модули.
Если функция завершается ошибкой, возвращаемое значение - NULL. Чтобы получить дополнительную информацию об ошибке, вызовите GetLastError.
Замечания
Возвращенный дескриптор - не глобальный или наследуемый. Его нельзя дублировать или использовать другим процессом.
Если lpModuleName не включает в себя путь и имеется больше, чем один загруженный модуль с тем же самым базовым именем и расширением, функция извлекает дескриптор модуля, который был загружен сначала.
Функция GetModuleHandle возвращает дескриптор отображаемого модуля без увеличения на единицу ее итогового числа ссылок. Поэтому, используйте осторожно при передаче дескриптора функции FreeLibrary, потому что такое выполнение может заставить модуль DLL преждевременно прекратить отображение.
Эта функция должна использоваться тщательно в многопоточном приложении. Нет никакой гарантии, что дескриптор модуля остается допустимым в промежутке времени когда эта функция возвращает дескриптор и, когда он используется. Например, поток извлекает дескриптор модуля, но прежде, чем он использует этот дескриптор, второй поток освобождает модуль. Если система загружает другой модуль, он может многократно использовать дескриптор модуля, который был недавно освобожден. Поэтому, первый поток получит дескриптор модуля другой, а не предназначенный.
Код примера
Пример, см. в статье Использование кистей.
Смотри также
Обзор Динамически подключаемые библиотеки (DLL), Функции, используемые DLL, FreeLibrary, GetModuleFileName, GetModuleHandleEx
Размещение и совместимость GetModuleHandle |
||
К |
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 |
Реализовано как GetModuleHandleW(Unicode) и GetModuleHandleA(ANSI). |
|
Замечания по платформе |
Не имеется |