В 32-разрядных DLL-библиотеках операционной системы Microsoft Windows NT вместо функций LibMain и WEP используется одна функция DLLEntryPoint, которая выполняет все необходимые задачи по инициализации библиотеки и при необходимости освобождает заказанные ранее ресурсы (имя функции инициализации может быть любым).
Функции LibMain и WEP вызываются только один раз при загрузке библиотеки в память и при ее выгрузке. В отличие от них, функция DLLEntryPoint вызывается всякий раз, когда выполняется инициализация процесса или задачи, обращающихся к функциям библиотеки, а также при явной загрузке и выгрузке библиотеки функциями LoadLibrary и FreeLibrary.
Ниже мы привели прототип функции DLLEntryPoint:
BOOL WINAPI DllEntryPoint(
HINSTANCE hinstDLL, // идентификатор модуля DLL-библиотеки
DWORD fdwReason, // код причины вызова функции
LPVOID lpvReserved); // зарезервировано
Через параметр hinstDLL функции DLLEntryPoint передается идентификатор модуля DLL-библиотеки, который можно использовать при обращении к ресурсам, расположенным в файле этой библиотеки.
Что же касается параметра fdwReason, то он зависит от причины, по которой произошел вызов функции DLLEntryPoint. Этот параметр может принимать следующие значения:
Значение |
Описание |
DLL_PROCESS_ATTACH |
Библиотека отображается в адресное пространство процесса в результате запуска процесса или вызова функции LoadLibrary |
DLL_THREAD_ATTACH |
Текущий процесс создал новую задачу, после чего система вызывает функции DLLEntryPoint всех DLL-библиотек, подключенных к процессу |
DLL_THREAD_DETACH |
Этот код причины передается функции DLLEntryPoint, когда задача завершает свою работу нормальным (не аварийным) способом |
DLL_PROCESS_DETACH |
Отображение DLL?библиотеки в адресное пространство отменяется в результате нормального завершения процесса или вызова функции FreeLibrary |
Параметр lpvReserved зарезервирован. В SDK, тем не менее, сказано, что значение параметра lpvReserved равно NULL во всех случаях, кроме двух следующих: