Функція DllMain

ФункціяDllMain- додаткова точка входу в бібліотеку, що динамічно підключається (DLL). Якщо функція використовується, то вона викликається системою тоді, коли процеси та потоки ініціалізовані та завершили роботу або при виклику функціїLoadLibraryтаFreeLibrary.

DllMain- ім'я - заступник для ім'я функції, що визначається бібліотекою. Ви повинні встановити дійсне ім'я, яке використовуєте, коли формуйте вашуDLL. Для отримання додаткових відомостей див. документацію, включену до інструментальних засобів розробки.

[in] Вказує, чомуDLLвикликає функцію точки входу. Цим параметром може бути одне з нижчезазначених значень.

[in] ЯкщоfdwReason-DLL_PROCESS_ATTACH,lpvReserved- ПУСТО (NULL) для динамічних завантажень і не ПУСТО (NULL) для статичних завантажень.

ЯкщоfdwReason-DLL_PROCESS_DETACH,lpvReserved- ПОРОЖНО (NULL), якщоDllMainвикликалася, використовуючиFreeLibraryі не ПУСТО (NULL), якщоDllMainвикликалася під час завершення роботи процесу.

Коли система викликає функціюDllMainзі значеннямDLL_PROCESS_ATTACH, функція повертає значення ІСТИНА (TRUE), якщо вона завершується успішно або БРЕХНЯ (FALSE), якщо ініціалізація завершується помилкою. Якщо значення, що повертається - брехня (FALSE), коли викликаєтьсяDllMain, тому що процес використовує функціюLoadLibrary,LoadLibraryповертає ПУСТО (NULL). (Система негайно викликає вашу функцію точки входу зDLL_PROCESS_DETACHі вивантажуєDLL.) КолиDllMainвикликається в ході ініціалізації процесу, якщо повертається значення - БРЕХНЯ (FALSE), процес закінчується з помилкою. Щоб отриматидодаткову інформацію про помилку, зателефонуйтеGetLastError.

Коли система викликає функціюDllMainз будь-яким значенням, а неDLL_PROCESS_ATTACH, значення, що повертається, ігнорується.

Є випадки в яких, функція точки входу викликається для потоку, що завершується, навіть якщо функція точки входу ніколи не викликаласяDLL_THREAD_ATTACHдля потоку:

  • Потік був початковим потоком у процесі, тому система викликала функцію точки входу зі значеннямDLL_PROCESS_ATTACH.
  • Потік був уже запущений, коли робився виклик функціїLoadLibrary, так що система ніколи не викликала для нього функцію точки входу.

КолиDLLвивантажується з процесу в результаті невдалого завантаженняDLL, завершення роботи процесу або викликуFreeLibrary, система не викликає функцію точки входуDLLз значеннямDLL_THREAD_DETACHдля окремих потоків процесу.DLLнадсилає лише повідомленняDLL_PROCESS_DETACH.DLLsможуть скористатися цією можливістю, щоб очистити всі ресурси для всіх потоків, відомихDLL. Однак, якщоDLLуспішно не завершує роботу з повідомленнямDLL_PROCESS_ATTACH, вона не отримує або повідомленняDLL_THREAD_DETACH,абоDLL_PROCESS_DETACH.

Увага!Функції точки входу повинні виконувати лише прості завдання ініціалізації. Вони не повинні викликати функціюLoadLibraryабоLoadLibraryEx(або функцію, яка викликає ці функції), тому що це може створити цикли взаємозалежності в порядку завантаженняDLL. Це може стати результатом того, щоDLLпочне використовуватися, перш ніж система виконає код її ініціалізації. Так само функція точки входу не повиннавикликати функціюFreeLibrary(або функцію, яка її викликає), тому що це може призвести до того, щоDLLпочне використовуватись після того, як система виконала код завершення її роботи.

Виклик імпортованих функцій, а неKernel32.dllможе призвести до проблем, які є важкими для діагностики. Наприклад, виклик функцій зUser,ShellіCOMможе спричинити помилки порушення прав доступу, тому що деякі функції в цихDLLsвикликають функціюLoadLibraryдля завантаження інших системних компонентів.

Щоб надати складнішу ініціалізацію, створіть процедуру ініціалізації дляDLL. Ви можете зажадати, щоб програми викликали цю процедуру ініціалізації перед викликом будь-яких інших процедурDLL. В іншому випадку Ви можете мати процедуру ініціалізації, яка створює іменований м'ютекс і має процедуру для кожноїDLL, які викликають процедуру ініціалізації, якщо м'ютекс не існує.