![]() |
|
сделать стартовой | добавить в избранное |
![]() |
Работа с библиотеками динамической компоновки (DLL) |
Андрей Уваров С самого рождения (или чуть позже) операционная система Wi dows использовала библиотеки динамической компоновки DLL (Dy amic Li k Library), в которых содержались реализации наиболее часто применяемых функций. Наследники Wi dows - и Wi dows 95, а также OS/2 - тоже зависят от библиотек DLL в плане обеспечения значительной части их функциональных возможностей. Рассмотрим ряд аспектов создания и использования библиотек DLL: как статически подключать библиотеки DLL; как динамически загружать библиотеки DLL; как создавать библиотеки DLL; как создавать расширения МFC библиотек DLL. Использование DLL Практически невозможно создать приложение Wi dows, в котором не использовались бы библиотеки DLL. В DLL содержатся все функции Wi 32 API и несчетное количество других функций операционных систем Wi 32. Вообще говоря, DLL - это просто наборы функций, собранные в библиотеки. Однако, в отличие от своих статических родственников (файлов . lib), библиотеки DLL не присоединены непосредственно к выполняемым файлам с помощью редактора связей. В выполняемый файл занесена только информация об их местонахождении. В момент выполнения программы загружается вся библиотека целиком. Благодаря этому разные процессы могут пользоваться совместно одними и теми же библиотеками, находящимися в памяти. Такой подход позволяет сократить объем памяти, необходимый для нескольких приложений, использующих много общих библиотек, а также контролировать размеры ЕХЕ-файлов. Однако, если библиотека используется только одним приложением, лучше сделать ее обычной, статической. Конечно, если входящие в ее состав функции будут использоваться только в одной программе, можно просто вставить в нее соответствующий файл с исходным текстом. Чаще всего проект подключается к DLL статически, или неявно, на этапе компоновки. Загрузкой DLL при выполнении программы управляет операционная система. Однако, DLL можно загрузить и явно, или динамически, в ходе работы приложения. Библиотеки импортирования При статическом подключении DLL имя .lib-файла определяется среди прочих параметров редактора связей в командной строке или на вкладке "Li k" диалогового окна "Projec Se i gs" среды Developer S udio. Однако .lib-файл, используемый при неявном подключении DLL, - это не обычная статическая библиотека. Такие .lib-файлы называются библиотеками импортирования (impor libraries). В них содержится не сам код библиотеки, а только ссылки на все функции, экспортируемые из файла DLL, в котором все и хранится. В результате библиотеки импортирования, как правило, имеют меньший размер, чем DLL-файлы. К способам их создания вернемся позднее. А сейчас рассмотрим другие вопросы, касающиеся неявного подключения динамических библиотек. Согласование интерфейсов При использовании собственных библиотек или библиотек независимых разработчиков придется обратить внимание на согласование вызова функции с ее прототипом. Если бы мир был совершенен, то программистам не пришлось бы беспокоиться о согласовании интерфейсов функций при подключении библиотек - все они были бы одинаковыми. Однако мир далек от совершенства, и многие большие программы написаны с помощью различных библиотек без C .
По умолчанию в Visual C интерфейсы функций согласуются по правилам C . Это значит, что параметры заносятся в стек справа налево, вызывающая программа отвечает за их удаление из стека при выходе из функции и расширении ее имени. Расширение имен ( ame ma gli g) позволяет редактору связей различать перегруженные функции, т.е. функции с одинаковыми именами, но разными списками аргументов. Однако в старой библиотеке С функции с расширенными именами отсутствуют. Хотя все остальные правила вызова функции в С идентичны правилам вызова функции в C , в библиотеках С имена функций не расширяются. К ним только добавляется впереди символ подчеркивания ( ). Если необходимо подключить библиотеку на С к приложению на C , все функции из этой библиотеки придется объявить как внешние в формате С: ex er "С" i MyOldCFu c io (i myParam); Объявления функций библиотеки обычно помещаются в файле заголовка этой библиотеки, хотя заголовки большинства библиотек С не рассчитаны на применение в проектах на C . В этом случае необходимо создать копию файла заголовка и включить в нее модификатор ex er "C" к объявлению всех используемых функций библиотеки. Модификатор ex er "C" можно применить и к целому блоку, к которому с помощью директивы # i clude подключен файл старого заголовка С. Таким образом, вместо модификации каждой функции в отдельности можно обойтись всего тремя строками: ex er "С" { #i clude "MyCLib.h" } В программах для старых версий Wi dows использовались также соглашения о вызове функций языка PASCAL для функций Wi dows API. В новых программах следует использовать модификатор wi api, преобразуемый в s dcall. Хотя это и не стандартный интерфейс функций С или C , но именно он используется для обращений к функциям Wi dows API. Однако обычно все это уже учтено в стандартных заголовках Wi dows. Загрузка неявно подключаемой DLL При запуске приложение пытается найти все файлы DLL, неявно подключенные к приложению, и поместить их в область оперативной памяти, занимаемую данным процессом. Поиск файлов DLL операционной системой осуществляется в следующей последовательности. Каталог, в котором находится ЕХЕ-файл. Текущий каталог процесса. Системный каталог Wi dows. Если библиотека DLL не обнаружена, приложение выводит диалоговое окно с сообщением о ее отсутствии и путях, по которым осуществлялся поиск. Затем процесс отключается. Если нужная библиотека найдена, она помещается в оперативную память процесса, где и остается до его окончания. Теперь приложение может обращаться к функциям, содержащимся в DLL. Динамическая загрузка и выгрузка DLL Вместо того, чтобы Wi dows выполняла динамическое связывание с DLL при первой загрузке приложения в оперативную память, можно связать программу с модулем библиотеки во время выполнения программы (при таком способе в процессе создания приложения не нужно использовать библиотеку импорта). В частности, можно определить, какая из библиотек DLL доступна пользователю, или разрешить пользователю выбрать, какая из библиотек будет загружаться. Таким образом можно использовать разные DLL, в которых реализованы одни и те же функции, выполняющие различные действия.
Например, приложение, предназначенное для независимой передачи данных, сможет в ходе выполнения принять решение, загружать ли DLL для протокола CP/IP или для другого протокола. Загрузка обычной DLL Первое, что необходимо сделать при динамической загрузке DLL, - это поместить модуль библиотеки в память процесса. Данная операция выполняется с помощью функции ::LoadLibrary, имеющей единственный аргумент - имя загружаемого модуля. Соответствующий фрагмент программы должен выглядеть так: HI S A CE hMyDll; :: if((hMyDll=:: LoadLibrary("MyDLL"))== ULL) { / не удалось загрузить DLL / } else { / приложение имеет право пользоваться функциями DLL через hMyDll / } Стандартным расширением файла библиотеки Wi dows считает .dll, если не указать другое расширение. Если в имени файла указан и путь, то только он будет использоваться для поиска файла. В противном случае Wi dows будет искать файл по той же схеме, что и в случае неявно подключенных DLL, начиная с каталога, из которого загружается exe-файл, и продолжая в соответствии со значением PA H. Когда Wi dows обнаружит файл, его полный путь будет сравнен с путем библиотек DLL, уже загруженных данным процессом. Если обнаружится тождество, вместо загрузки копии приложения возвращается дескриптор уже подключенной библиотеки. Если файл обнаружен и библиотека успешно загрузилась, функция ::LoadLibrary возвращает ее дескриптор, который используется для доступа к функциям библиотеки. Перед тем, как использовать функции библиотеки, необходимо получить их адрес. Для этого сначала следует воспользоваться директивой ypedef для определения типа указателя на функцию и определить переменную этого нового типа, например: // тип PF MyFu c io будет объявлять указатель на функцию, // принимающую указатель на символьный буфер и выдающую значение типа i ypedef i (WI API PF MyFu c io )(char ); :: PF MyFu c io pf MyFu c io ; Затем следует получить дескриптор библиотеки, при помощи которого и определить адреса функций, например адрес функции с именем MyFu c io : hMyDll=::LoadLibrary("MyDLL"); :: i iCode=( pf MyFu c io )("Hello"); Адрес функции определяется при помощи функции ::Ge ProcAddress, ей следует передать имя библиотеки и имя функции. Последнее должно передаваться в том виде, в котором экспортируется из DLL. Можно также сослаться на функцию по порядковому номеру, по которому она экспортируется (при этом для создания библиотеки должен использоваться def-файл, об этом будет рассказано далее): MAKEI RESOURCE(1)); После завершения работы с библиотекой динамической компоновки, ее можно выгрузить из памяти процесса с помощью функции ::FreeLibrary: ::FreeLibrary(hMyDll); Загрузка MFC-расширений динамических библиотек При загрузке MFC-расширений для DLL (подробно о которых рассказывается далее) вместо функций LoadLibraryи FreeLibrary используются функции AfxLoadLibrary и AfxFreeLibrary. Последние почти идентичны функциям Wi 32 API. Они лишь гарантируют дополнительно, что структуры MFC, инициализированные расширением DLL, не были запорчены другими потоками. Ресурсы DLL Динамическая загрузка применима и к ресурсам DLL, используемым MFC для загрузки стандартных ресурсов приложения.
endlessly; бесконечно большая величина infinite; бесконечно малая величина infinitesimal бесконечность infinity бесконечный endless, infinite; бесконечное повторение временной задержки на параллельном порту infinite retry on parallel printer time out бесконечныйцикл endless loop, infinite loop бесполезный purposeless; helpless беспорядок disarrangement, disorganization, disorder; приводитьвбеспорядок disarray, disarrange, disorder беспроводная локальная сеть wireless LAN беспроводный wireless, cordless бессистемность nonsystem бессистемный methodless бессодержательный matterless бесцельный purposeless бесчисленный innumerable бета-версия (версия программы для бета-тестирования) beta-version, beta-release бета-тестирование (пробная эксплуатация программного продукта) beta testing библиографическая ссылка bibliographical reference библиографический bibliographical библиотека library; озаглавленная библиотека named library библиотека данных data library библиотека динамического связывания dynamic link library (DLL)
3. Особенности анализа функции полезности с ординалистской позиции
4. Выбор и анализ функций управления
5. Построение и анализ функции спроса на товар
9. Анализ эпизода литературного произведения: композиция, содержательные функции художественной детали
10. Изучение функций в курсе математики VII-VIII классов
12. Применение контент-анализа в изучении межэтнической напряженности
14. Анализ области определения функции
15. Основы распараллеливания программ, их динамический анализ
16. Анализ динамических свойств системы автоматического управления заданной структурной схемы
17. Методы изучения и анализа существующих систем управления
18. Анализ конкурентоспособности торговых марок чая на основе изучения его ассортимента
19. Маркетинг услуг. Функции рекламы. SWOT-анализ региона
20. Анализ поведения функций при заданных значениях аргумента
26. Динамический синтез и анализ рычажного механизма
27. Анализ динамического поведения механической системы
29. Разработка программных средств анализа графика функции и решение оптимизационных задач
30. Tupolev 154M noise asesment (Анализ шумовых характеристик самолёта Ту-154М)
31. Анализ устойчивости и поддержание орбитальной структуры космической системы связи
32. Изучение гнездований зяблика (Fringilla coelebs) Вологодской области
33. Клонирование и анализ генов легких цепей иммуноглобулинов стерляди
34. Функции белков в организмах живых существ
35. How "DNA" testing works Анализ "ДНК" как проверяющие работы)
36. Синапсы (строение, структура, функции)
41. Анализ рынка углеводородов стран Центральной и Южной Азии
42. История изучения и использования природных вод на Урале
44. Статистический анализ демографической ситуации в Российской Федерации
45. Анализ бюджетного дефицита за 1990-1996 годы
46. Анализ регулирования и финансирования бюджетного дефицита с 1985 и по наши дни
47. Сущность, функции и классификация налогов
48. Задачи, система и функции органов юстиции Российской Федерации
49. Задачи, основные функции и система ОВД
50. Анализ проблем возмещения ущерба, причиненного незаконными действиями государственных органов
51. Памятники права в историческом изучении
53. Либерализм и марксизм: сравнительный анализ
58. Референдум и его социальная функция
60. Местное самоуправление в Украине (историко-правовой анализ)
61. Историко-правовой анализ Закона СССР "о разграничении полномочий между СССР и субъектами федерации"
62. Задачи, система и функции органов юстиции Российской Федерации
63. Уголовное преследование как функция государства
67. Функции государства: налогообложение и взимание налогов
68. Анализ современных моделей реформирования налоговой системы
69. Структура налоговых органов РФ права, обязанности и функции
73. Государство: понятие, признаки, формы правления и функции
75. Феодальное государство (экономическая основа, сущность, механизм, функции и формы)
76. Структура и функции государственного аппарата
77. Учет и анализ расчетов с персоналом по оплате труда в организации
78. Лингвистика - влияние первого языка на изучении второго
79. Грамматический анализ субстантивированных прилагательных и причастий
80. Использование интегрированных курсов при изучении иностранного языка
82. Tupolev 154M noise asesment (Анализ шумовых характеристик самолёта Ту-154М)
84. Синтактико-семантический анализ составляющих сложносоставных слов в английском языке
85. Лексико-семантический анализ современных англоязычных рекламных слоганов
90. Сравнительный анализ культуры Средневековья и Возрождения
91. Культура как социальное явление. Ее основные функции
92. Культура, ее функции, субъекты
93. И.И.Крылов на Кавказских Минеральных Водах. Изучение проблемы
94. Анализ новгородской иконы "Спас нерукотворный"
95. Анализ стихотворения А.С.Пушкина "Элегия"
96. Анализ авторской пунктуации в художественном тексте
97. Сопоставительный анализ фразеологизмов с анимализмами в немецком и русском языках
98. Поэзия природы: средства изобразительности и функции