КАТЕГОРИИ: Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748) |
Interface
End. Begin Структура DLL- библиотеки. Динамически загружаемые библиотеки (DLL). Лекция 28 DLL позволяют ядру Windows, наряду с гибким управлением памятью, использовать минимальный объем памяти для выполнения программы. В отличие от традиционного подхода, когда подпрограммы, используемые программой, подключаются к ней статически при компоновке программы, в среде Windows подпрограммы из DLL подключаются динамически, то есть в процессе выполнении программы, причем несколько, одновременно выполняющихся программ могут использовать одну и туже копию подпрограммы из DLL. Библиотека DLL - это специальным образом оформленная программная единица, предназначенная для хранения подпрограмм (функций и процедур) и ресурсов (например, форм). DLL библиотека формируется и компилируется независимо от использующих ее программ. В самих программах указываются только обращения к подпрограммам. В отличие от модуля, DLL- библиотека подключается к программе динамически, то есть после начала выполнения программы и, кроме того, она может передавать другим программным единицам только подпрограммы, хотя сама DLL может иметь все те же разделы, что и модуль. Library имя; - заголовок библиотеки; Uses раздел модулей; Label.........; Раздел меток; Const.........; Раздел констант; Type..........; Раздел типов; Var...........; Раздел переменных; ....... ....... Раздел подпрограмм; Exports раздел экспортирования подпрограмм; ........ секция инициализации; Правила записи разделов DLL- библиотеки такие же, как и в случае программы на ТР. После раздела модулей могут располагаться разделы описания типов, констант, переменных. Например, если в списке формальных параметров подпрограммы есть массив, то необходимо в библиотеке предусмотреть раздел Type и объявить в нем идентификатор типа массива. Раздел экспортирования предназначен для указания подпрограмм, которые можно передавать в другие программы. Из DLL- библиотеки можно экспортировать только подпрограммы, имена которых указаны в разделе Exports. Подпрограммы, имена которых не указаны в разделе Exports, можно использовать только внутри DLL-библиотеки. Секция инициализации аналогична такой же секции модуля и выполняется один раз при загрузке библиотеки. Эта секция начинается с зарезервированного слова Begin и заканчивается словом End., в ней можно записывать операторы, выполняющие инициализацию параметров, открытие файлов и т.п. Раздел Exports записывается в виде Exports объявление 1, объявление 2,.... объявление n; где объявление Х - задает характеристики конкретной экспортируемой подпрограммы. Есть несколько способов задания объявления. 1 способ. Объявление задается именем подпрограммы, например, Exports Sum; 2 способ. Объявление задается именем и номером (с помощью директивы Index). Пример. Exports Sum Index 1, Mult Index 2; Этот способ является самым быстрым по вызову.
5.15.1. Создание DLL- библиотеки. В Delphy имеются специальные средства для создания DLL библиотек. Пример. Создадим DLL библиотеку содержащую две процедуры: MX - определение максимального числа из V1 иV2; PFY2 - вычисление значения функции У=А*Х*Х. 1. Выполнить команды File \ New - появится окно NewItem. Выделим пиктограмму DLL и щелкнем по кнопке ОК. Откроется окно с заготовкой DLL. library Project1; { Комментарии } uses SysUtils, Classes; {$R *.RES}
begin end.
2. Удалим комментарии и добавим в заготовку после директивы компилятора {$R *.RES} процедуры max и Pfy, а также укажем в разделе экспортирования объявление подпрограмм спомощью имени и номера. В результате получится текст:
Library Project1; uses Sysutils,classes; {$R *.RES} Procedure max(v1,v2:Extended; Var Z:Extended); begin If v1 > v2 Then Z:=v1 Else Z:=v2; end;
Procedure Pfy(a,x:Extended; Var Fy:Extended); begin Fy:=a*Sqr(x); end;
Exports Max index 1, Pfy index 2; begin End. 3. Сохраним проект под именем MyDLL.dll в отдельной папке. 4. Выполнить пункт меню Project \ Build Project. Выполнить компиляцию, исправить ошибки. При успешной компиляции в нашей папке появится файл MyDLL.dll.
5.15.2. Вызов Dll. Под вызовом библиотеки понимается использование имеющихся в ней подрпограмм (процедур и функций) и ресурсов. При вызове библиотеки программист не имеет возможности указать ее размещение, поэтому библиотека должна быть расположена в папке, в которой Windows может обнаружить ее автоматически. Такими папками являются: корневая папка Windows, ее папки System и System, а также папка из которой запущено приложение. Различают два способа вызова подпрограмм из библиотеки: - статический и динамический. Заметим, что в данном случае эти термины используются в несколько ином смысле, чем ранее. В обоих способах вызова библиотека загружается в оперативную память во время выполнения приложения, то есть динамически. При статическом вызове библиотека загружается в оперативную память вместе с использующими ее приложениями и другими библиотеками и выгружается после прекращения работы последнего использующего ее процесса. Достоинством статического вызова является простота реализации в программе. Однако при таком вызове программист не может управлять процессом загрузки библиотеки и, кроме того, библиотека находится в оперативной памяти все время работы приложения, даже если она не будет использована. При динамическом вызове библиотечных функций программист может управлять процессом загрузки библиотек, а также экономить оперативную память, загружая только нужные в данный момент библиотеки. Например, если библиотека содержит форму для настройки приложения (и используется редко), то имеет смысл загружать ее только на время использования содержащихся в ней кода и ресурсов. Рассмотрим статическое импортирование. При статическом импортировании в секции implementation модуля формы задается заголовок импортируемой подпрограммы с директивой External. При вызове подпрограммы DLL библиотеки возможны два варианта: а) вызов подпрограммы из библиотеки по имени, в этом случае после слова External записывается только имя библиотеки, например Procedure Pfy(a,x:Extended; Var Fy:Extended); External ‘MyDLL.dll’;
б) вызов подпрограммы по ее номеру. Все подпрограммы в библиотеке пронумерованы. И по номеру можно вызвать соответствующую подпрограмму. Для этого после директивы External и имени библиотеки записывается директива Index и номер подпрограммы, например, так
Procedure Pfy(a,x:Extended; Var Fy:Extended); External ‘MyDLL.dll’ Index 3;
Это самый быстрый вызов. При статическом импортировании сама библиотека вызывается операционной системой при первом к ней обращении и выгружается, когда потребность в ней отпадает (когда программа прекратит свою работу, если только библиотека не используется в это время другими программами). Таким образом, в данном случае заботиться о загрузке и выгрузке библиотеки не требуется.
Дата добавления: 2014-01-04; Просмотров: 329; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |