Обмеження бібліотек dll, що завантажуються з затримкою

Існує ряд обмежень, пов'язаних з відкладеним завантаженням файлів імпорту.

Файли імпорту даних не підтримуються. Існує обхідний шлях, що полягає в явному імпорті даних за допомогою методів LoadLibrary (або GetModuleHandle після того, як допоміжна функція відкладеної завантаження завантажила бібліотеку DLL) і GetProcAddress.

Відкладене завантаження Kernel32.dll не підтримується. Ця бібліотека DLL необхідна для того, щоб допоміжні підпрограми відкладеної завантаження могли виконати відкладену завантаження.

Відкладене завантаження бібліотеки DLL може змінити поведінку процесу, якщо в точці входу бібліотеки DLL, що завантажується з затримкою, здійснюється ініціалізація процесів. Ще один подібний випадок - це статична пам'ять TLS (локальна пам'ять потоку), оголошується за допомогою директиви __declspec (thread). Вона не працює, якщо бібліотека DLL завантажується за допомогою методу LoadLibrary. Проте, як в статичних бібліотеках DLL, так і в бібліотеках DLL, що завантажуються з затримкою, доступна для використання динамічна пам'ять TLS, що реалізується за допомогою функцій TlsAlloc. TlsFree. TlsGetValue і TlsSetValue.

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

В даний час не існує способу відкласти завантаження окремих підпрограм в бібліотеці DLL при використанні нормального механізму імпорту.

Призначені для користувача угоди про виклики (наприклад використання умовних кодів в архітектурі x86) не підтримуються. Крім того, регістри з плаваючою комою не зберігається на одній платформі. Якщо для користувача допоміжна підпрограма або обробник використовують типи даних з плаваючою комою, то в них буде потрібно виконати повне збереження і відновлення стану регістрів з плаваючою комою на комп'ютерах, де в угодах про виклики для передачі параметрів з плаваючою комою використовуються регістри. Слід обережно підходити до відкладеної завантаження бібліотеки DLL часу виконання (CRT), якщо в програмі викликаються функції CRT, які беруть параметри з плаваючою комою через стек арифметичного співпроцесора (NDP) в допоміжній функції.

Схожі статті