Функція входу / виходу DLL

Припустимо, що вашій бібліотеці динамічного компонування потрібна деяка ініціалізація і деініціалізацію Наприклад, якщо в DLL при її завантаженні вьщеляют якісь ресурси, то при її звільненні ці ресурси також повинні звільнятися

Особливе значення має деініціалізацію: оскільки при відключенні DLL від адресного простору процесу вьщеленная нею память сама собою не звільняється, а відкриті файли не закриваються, DLL повинна самостійно забезпечувати «прибирання сміття»

Для вирішення зазначених проблем ви можете включити до складу DLL спеціальну функцію точки входу DllMain Ця функція викликається операційною системою у таких випадках:

коли DLL проектується на адресний простір процесу (підключення DLL)

– коли процесом, завантаживши DLL, викликається новий потік

– коли завершується потік, що належить процесу, який повязаний з DLL

-Коли процес звільняє DLL (відключення DLL) Функція точки входу DllMain має наступний прототип:

BOOL WINAPI DllMain(

HINSTANCE hinstDLL, / / ​​дескриптор DLL-модуля DWORD fdwreason, / / ​​прапор причини виклику функції LPVOID lpvReserved / / додаткова інформація

)  

У момент виклику функція отримує інформацію від операційної системи через свої параметри

Перший параметр, hinstDLL, приймає значення дескриптора модуля DLL, що є, по суті, віртуальною адресою завантаження DLL Якщо в бібліотеці є виклики функцій, яким потрібен даний дескриптор, необхідно зберегти значення hinstDLL в глобальної змінної

Другий параметр, fdwReason, може приймати одне з наступних значень:

– DLLPROCESSATTACH повідомлення про те, що DLL завантажена в адресний простір процесу або в результаті його старту, або в результаті виклику функції LoadLibrary

– DLLTHREADATTACH повідомлення про те, що поточний процес створив новий потік Це повідомлення надсилається всім DLL, підключеним до процесу Виклик DllMain відбувається в контексті нового потоку

– DLLTHREADDETACH повідомлення про те, що потік коректно завершується Виклик DllMain відбувається в контексті завершується потоку

DLLPROCESSDETACH повідомлення про те, що DLL відключається від адресного простору процесу в результаті одного з трьох подій: а) невдале завершення завантаження DLL б) виклик функції FreeLibrary в) завершення процесу

Якщо при виклику функції використовується перший параметр із значенням DLLPROCESSATTACH, то за значенням третього параметра можна зясувати, яким способом завантажується DLL При явній завантаженні параметр IvlReserved дорівнює нулю, а при неявній завантаженні приймає нульове значення

Слід відзначити наступні моменти роботи з функцією входу-виходу DLL:

1&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp Потік, що викликав DllMain зі значенням DLLPROCESSATTACH, не викликає повторно DllMain зі значенням DLLTHREADATTACH

2&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp Коли DLL завантажується викликом функції LoadLibrary, існуючі потоки не викликають DllMain для знову завантаженої бібліотеки

3&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp Функція DllMain не викликається, якщо потік або процес завершуються з причини виклику функції TerminateThread або TerminateProcess

Оскільки функція DllMain повинна обробляти всі можливі причини свого виклику, то в її коді обьгано аналізується dwReason і виконуються необхідні дії з ініціалізації або звільненню ресурсів

Джерело: Сучкова, ЛІ Win32 API: основи програмування: навчальний посібник / ЛІ Сучкова АлтГТУ ім ШІ Ползунова -Барнаул, АлтГТУ, 2010 138 с, іл

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*