Процедура входа (entry point) - это функция или блок кода, с которого начинается выполнение программы. В зависимости от типа приложения и языка программирования, параметры процедуры входа могут различаться. Давай рассмотрим несколько типов приложений и соответствующие параметры их процедур входа:
BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) {
// Тело функции
switch (ul_reason_for_call) {
case DLL_PROCESS_ATTACH:
// Вызывается при загрузке DLL в адресное пространство процесса
// lpReserved - NULL для статически загруженных DLL, не NULL для динамически загруженных
break;
case DLL_THREAD_ATTACH:
// Вызывается при создании нового потока в процессе
break;
case DLL_THREAD_DETACH:
// Вызывается при завершении потока
break;
case DLL_PROCESS_DETACH:
// Вызывается при выгрузке DLL из адресного пространства процесса
break;
}
return TRUE;
}
Описание параметров:
hModule (Handle to Module):
Это дескриптор (указатель) на экземпляр DLL в адресном пространстве процесса. Он может использоваться, например, для получения пути к файлу DLL.
ul_reason_for_call (Reason for Call):
Это значение, указывающее на причину вызова DllMain. Оно принимает одно из следующих значений:
DLL_PROCESS_ATTACH: DLL загружается в адресное пространство процесса.
DLL_THREAD_ATTACH: Создается новый поток в процессе.
DLL_THREAD_DETACH: Завершается поток.
DLL_PROCESS_DETACH: DLL выгружается из адресного пространства процесса.
lpReserved:
Это указатель, который может быть использован в различных сценариях. Для DLL_PROCESS_ATTACH, если DLL загружена динамически (с использованием LoadLibrary), lpReserved не равен NULL. В остальных случаях обычно равен NULL.
Функция DllMain должна возвращать TRUE, если загрузка или выгрузка DLL прошла успешно, и FALSE в случае ошибки.