Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции Delphi (Колосов).pdf
Скачиваний:
77
Добавлен:
11.05.2015
Размер:
2.57 Mб
Скачать

на диске проект, мы получим 6 файлов с расширениями *.dpr, *.pas, *_tlb.pas, *.tlb, *.dfm, *.res, которые описыавют:

*.dpr – DLL библиотеку, реализующую COM сервер,

*.pas – реализацию ActiveX формы,

файл с окончанием _tlb и расширением pas – библиотеку типов COM– объекта в формате Delphi,

*.tlb – библиотеку типов COM объекта в двоичном формате,

*.dfm – форму в формате Delphi,

*.res – ресурсы формы.

Теперь в среде Delphi можно переносить на форму любые компоненты и настраивать их свойства и события, одновременно будет изменяться содержимое описанных выше файлов. Остается только зарегистрировать новый ActiveX компонент и включить его в состав одного из пакетов.

28. ДИНАМИЧЕСКИЕ БИБЛИОТЕКИ

Динамически подключаемые библиотеки (Dynamic Link Library – DLL) играют важную роль в функционировании ОС Windows и прикладных программ.

DLL представляют собой файлы с откомпилированным исполняемым кодом, который используется приложениями и другими DLL. Реализация многих функций ОС вынесена в динамические библиотеки, которые используются по мере необходимости, обеспечивая тем самым экономию адресного пространства. DLL загружается в физическую память один раз, когда к ней обращается какой–либо процесс. Для всех процессов, использующих DLL, в их виртуальной памяти отображаются только образы этих библиотек, при этом для каждого процесса создается впечатление, что DLL загружена именно в его адресное пространство. По существу, динамические библиотеки отличаются от исполняемых файлов только одним, они не могут быть запущены самостоятельно. Следует отметить, что DLL не имеет своего стека и очереди сообщений Windows. При вызове подпрограмм из DLL используется стек вызывающей программы. Для того чтобы динамическая библиотека начала работать, необходимо, чтобы она была вызвана уже запущенной программой или работающей DLL.

Обычно в динамические библиотеки выносятся группы функций, которые применяются для решения сходных задач. Динамическая библиотека может использоваться несколькими приложениями, при этом не обязательно, чтобы все они были созданы при помощи одного языка программирования.

Разновидностью динамических библиотек являются пакеты Delphi, предназначенные для хранения кода компонентов для среды разработки и приложений. Применение динамических библиотек позволяет добиться ряда преимуществ:

уменьшаются размер исполняемого файла приложения и занимаемые им ресурсы;

функции DLL могут использовать несколько процессов одновременно;

136

управление динамическими библиотеками возлагается на операционную систему;

внесение изменений в DLL не требует перекомпиляции всего проекта;

одну DLL могут использовать программы, написанные на разных языках программирования.

28.1. Создание DLL

Одним из способов создания динамической библиотеки является прохождение пути File New Other New и использование значка «DLL Wizard». Будет создан пустой модуль с первым ключевым словом Library и заданным именем библиотеки. Библиотеку следует сохранять с тем же именем и расширением pas. Структура библиотеки похожа на структуру модуля Unit. Внутри библиотеки можно описывать типы, константы и переменные, но они будут доступны только внутри модуля. Процедуры и функции, описанные в библиотеке, будут доступны извне модуля, если их перечислить в разделе Exports. В конце модуля библиотеки между словами Begin и End можно расположить операторы исполняемой части модуля, но они будут выполнены только один раз, при первой загрузке модуля в память. В общем случае библиотечный модуль может иметь вид

Library MyLib; Users SysUtils,Classes;

Function F1(….):тип1; Begin

……..

end;

Procedure P2(….); Begin

……..

end;

Procedure P3(…..); Begin

……..

end; Exports F1,

P2 index 2,

P3 index 3 name ’Proc3’; Begin

End.

Здесь описана библиотека с именем MyLib, в которую входят три подпрограммы F1, P2 и P3. Для внешнего использования можно вызывать программы или по именам – F1 и Proc3, или по индексам – 2 и 3. После трансляции этого модуля будут создана библиотека MyLib.DLL.

137

28.2. Использование DLL

При программировании можно использовать статическую или динамическую загрузку DLL. При статической загрузке следует в разделе описаний основной программы вставить для приведенного выше примера следующие операторы:

Function F1(….):тип1; external ’MyLib’; Procedure P2(….); external ’MyLib’; Procedure Proc3(…..); external ’MyLib’;

Они определяют названия внешних процедур и функций и библиотеку, из которой их следует импортировать при запуске программы.

При динамической загрузке DLL следует в разделе типов определить типы импортируемых процедур и функций, зарезервировать переменную типа THandle для указателя на динамическую библиотеку и переменные для указателей на импортируемые процедуры и функции, загрузить библиотеку с помощью функции LoadLibrary и определить указатели на процедуры и функции с помощью функции GetProcAddress. Для нашего примера это может выглядеть следующим образом:

Procedure TForm1.Button1Click(Sender:TObject); Type TF1=Function(….):тип1;

TP2=Procedure(….);

TP3=Procedure(….); Var LibH:THandle;

Fun1:TF1;

Proc2:TP2;

Proc3:TP3;

Begin

LibH:=LoadLibrary(’MyLib’);

@Fun1:=GetProcAddress(LibH,’F1’);

@Proc1:=GetProcAddress(LibH,Pchar(LongInt(2)));

@Proc3:=GetProcAddress(LibH,’Proc3’);

…………

FreeLibrary(’MyLib’);

End;

Для статической загрузки DLL проще создать интерфейсный модуль, в котором описать все типы, используемые в DLL, и определить импортируемые процедуры и функции с указанием, из каких DLL они импортируются. В основной программе достаточно будет только указать имя интерфейсного модуля в операторе Users.

28.3. Пример написания DLL

Рассмотрим пример практического использования создаваемой DLL библиотеки для проверки регистрационного номера любой программы при ее инсталяции с помощью поставляемой вместе с Delphi программы Install Shield Express. В разделе Dialogs выберем страничку Customer Information и в ней зададим следующие параметры:

138

Show Serial Number

Yes

Serial Number Template

????-????

Serial Number Validation DLL d:\my\MyLib.DLL

Validate Function

ValNum

Success Return Value

24

Retry Limit

3

В данном случае серийный номер устанавливаемой программы будет состоять из двух частей по 4 произвольных символа в каждой части. Проверка номера будет проводиться программой ValNum из библиотеки MyLib. При правильно введенном регистрационном номере эта функция должна возвращать значение 24. Допускается не больше 3 попыток введения правильного номера.

Для решения этой задачи можно написать следующую DLL:

Library MyLib; uses

SysUtils, Classes, {$F+}

//При вызове функции Val используется стандартное для Windows

//соглашение о передаче параметров – stdcall

Function VAL(h:word;ps1,ps2,ps3,ps4:Pchar):longint; stdcall; const sn=’ABCD1234’; // Правильное значение серийного номера var s:string[20];

Begin

s:=strpas(ps3); // Переводим третий параметр в обычную строку if s:=sn then val:=24 else val:=-1; // Проверяем серийный номер end;

Exports

VAL name ’ValNum’;// Внешнее имя функции – ValNum begin

end.

139