Ограничения библиотек DLL, загружаемых с задержкой
Обновлен: Ноябрь 2007
Существует ряд ограничений, связанных с загружаемыми с задержкой файлами импорта.
Файлы импорта данных не поддерживаются. Существует обходной путь, заключающийся в явном выполнении импорта данных с помощью методов LoadLibrary (или GetModuleHandle после того, как вспомогательный модуль загрузки с задержкой загрузил библиотеку DLL) и GetProcAddress.
Загрузка Kernel32.dll с задержкой не поддерживается. Эта библиотека DLL необходима для того, чтобы подпрограммы вспомогательного модуля загрузки с задержкой могли выполнить загрузку с задержкой.
Связывание переадресованных точек входа не поддерживается.
Загрузка библиотеки DLL с задержкой может изменить поведение процесса, если в точке входа библиотеки DLL, загружаемой с задержкой, осуществляется внутрипроцессная инициализация. Еще один подобный случай — это статическая память TLS (локальная память потока), объявляемая с помощью директивы __declspec(thread); она не работает, если библиотека DLL загружается с помощью метода LoadLibrary. Тем не менее, как в статических библиотеках DLL, так и в библиотеках DLL, загружаемых с задержкой, доступна для использования динамическая память TLS, реализуемая с помощью функций TlsAlloc, TlsFree, TlsGetValue и TlsSetValue.
Статические (глобальные) указатели импортируемых функций потребуется инициализировать заново после первого вызова соответствующих функций. Причина в том, что при первом вызове указатель функции указывает на преобразователь.
В настоящее время не существует способа загрузить с задержкой отдельные процедуры в библиотеке DLL при использовании нормального механизма импорта.
Пользовательские соглашения о вызове (например, использование условных кодов на архитектурах x86) не поддерживаются. Также нельзя использовать типы данных с плавающей запятой в любых вспомогательных подпрограммах и обработчиках на компьютерах с архитектурой RISC. Регистры с плавающей запятой не сохраняются ни на одной платформе. Если пользовательская вспомогательная подпрограмма или обработчик использует типы данных с плавающей запятой, то в них потребуется выполнить полное сохранение и восстановление состояния регистров с плавающей запятой на компьютерах, где в соглашениях о вызове для передачи параметров с плавающей запятой используются регистры. Следует осторожно подходить к загрузке с задержкой библиотеки DLL времени выполнения (CRT), если в программе вызываются функции CRT, принимающие параметры с плавающей запятой через стек арифметического сопроцессора (NDP) во вспомогательной функции.