- 2.4. Отложенная загрузка.
Для чего же нужна отложенная загрузка? Представьте себе ситуацию: вы написали приложение, использующее стандартные системные библиотеки вашей новой операционной системы, скажем, для проверки орфографии. Даёте это приложение пользователю, который использует ОС более старой версии, чем у вас и в этой ОС нет функций для проверки орфографии. А пользователю это не сильно и надо. Приложение будет работать, пока не обратится к необходимой функции. То есть, фактически, DLL не нужна до обращения к определённой функции. Исключение отсутствия можно обработать и выдать пользователю предупреждение с просьбой обновить библиотеки своей ОС (и т.п.).
Использование отложенной загрузки DLL в C++ Builder мало отличается от неявной загрузки. В проект добавляется заголовочный (*.h) файл с описаниями и библиотечный файл (*.lib). Далее, переходим в Project -> Options -> C++ Linker -> Advanced -> Delay Load DLLs и вписываем название нашей библиотеки (TestDLL.dll).
Когда библиотека теряет свою необходимость её нужно явно выгрузить с помощью __FUnloadDelayLoadedDLL. В качестве параметра передаём имя DLL (с расширением + параметр регистрозависим). Если вы используете многопоточные приложения - убедитесь, что все потоки завершили работу с DLL.
Примечание: Нельзя использовать отложенную загрузку для библиотек, имеющих секцию импорта (т.е. использующих другие библиотеки), а также Kernel32.dll и RTLDLL.dll (т.к. функции поддержки отложенной загрузки как раз и находятся в последней).
3. Заключение.
Данная статья даёт вам представление о возможных вариантах использования DLL в ваших проектах. При внимательном ознакомлении с методами загрузки можно выбрать наиболее оптимальный вариант.
Подведя итоги можно выявить плюсы и минусы описанных методов:
Явная загрузка: + контроль и управление процессом жизни DLL. - управлением DLL занимается программист посредством WinAPI.
Неявная загрузка: + все заботы берет на себя компилятор и сборщик. - ресурсы заняты всё время жизни приложения.
Отложенная загрузка: + все заботы берет на себя компилятор и сборщик. + возможность использования приложения с не полностью совместимыми DLL. - необходимость усиленного контроля за многопоточными приложениями.
|