Думаю, многие знают, что такое DLL (dynamic link library - динамические библиотеки). У библиотек есть немало преимуществ, достаточно веских, что бы их использовать. В этой статье мы научимся создавать и использовать динамические библиотеки в своих проектах.

Зачем они нужны

А зачем эти самые библиотеки мне нужны? - спросите вы. Ну я не знаю, может они вам вообще не нужны. А может и жизненно необходимы. Перечислю возможности и преимущества библиотек:

Универсальность. Любой программист, зная описания и имена функций, находящихся в библиотеке, может использовать их.

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

Хранилища ресурсов.. В DLL можно хранить ресурсы, такие как рисунки, формы, иконки меню, и т.д.

Взгляд на будущее. С помощью библиотек можно легко создавать плагины, расширяющие стандартные возможности программы. Т.е. можно не выпускать различные версии программы, а выпускать плагины или модифицированные (например с исправленными ошибками) версии библиотек.

Совместное использование. Если библиотека загружена, то её могут использовать и другие приложения.

Экономия ресурсов. Библиотеку можно загрузить и выгрузить тогда, когда это действительно необходимо. Например, программа в нужный момент загрузила DLL, вызвала функцию, сделала работу и выгрузила библиотеку до следующего раза. Налицо экономия памяти

Вобщем DLL - зверь полезный и очень даже дружелюбный.

Структура динамической библиотеки

Что бы создать библиотеку в Delphi6 выберите File -> New -> Other и в появившемся окне выберите DLL Wizard. Дельфи сгенерирует шаблон для библиотеки:

library Project;

{ Important note about DLL memory management: ShareMem must be the

first unit in your library"s USES clause AND your project"s (select

Project-View Source) USES clause if your DLL exports any procedures or

functions that pass strings as parameters or function results. This

applies to all strings passed to and from your DLL--even those that

are nested in records and classes. ShareMem is the interface unit to

the BORLNDMM.DLL shared memory manager, which must be deployed along

with your DLL. To avoid using BORLNDMM.DLL, pass string information

using PChar or ShortString parameters. }

uses

SysUtils,

Classes;

{$R *.res}

begin

end.

В комментарии указывается на необходимость вставить ссылку на модуль ShareMem, если библиотека экспортирует длинные строки в параметрах обращения к подпрограммам или как результат функций. Эта ссылка должна быть первой как в предложении uses библиотеки, так и в uses файла проекта программы, которая использует эту библиотеку. Если подпрограммы библиотеки экспортируют строки ShortString или PChar, ссылаются на ShareMem не обязательно. Что бы не возникало недоразумений в своих библиотеках я рекомендую вместо типа String пользоваться PChar, а по необходимости конвертируйте типы функциями PChar (конветирует из String в PChar) и StrPas (конвертирует из PChar в String).

Структура библиотеки похожа на структуру обычного модуля. Теперь создайте библиотеку с таким текстом:

library Project2;

uses

SysUtils,

Classes;

function MyFunc(num1, num2, Errcode : Integer; Operation : PChar) : Integer; stdcall;

begin

try

if Operation="plus" then

Result := num1+num2;

if Operation="minus" then

Result := num1-num2;

if Operation="multiply" then

Result := num1*num2;

if Operation="div" then

Result := num1 div num2;

if Operation="mod" then

Result := num1 mod num2;

except Result := Errcode;

end;

end;

exports

MyFunc INDEX 1 NAME "MathFunc";

begin

end.

Сохраните это все куда нибудь и скомпилируйте (Ctrl+F9)

Это будет демонстрационная библиотека, на которой я буду показывать различные приемы работы с DLL. Но для начала давайте рассмотрим текст этой библиотеки.

function MyFunc(num1, num2, Errcode : Integer; Operation : PChar) : Integer; - это обычная функция, возвращающая целое число. Основываясь на параметре Operation функция решает, какую операцию сделать над операндами num1 и num2. В случае ошибки она возвращает переданный ей параметр Errcode. Т.е. в программе можно будет проанализировать, возникла ли ошибка во время исполнения функции.

stdcall указывает на то, что функция будет вызываться "обычным" способом, т.е. программы, написанные на других языках тоже смогут пользоваться библиотекой. Можно использовать - "register", предназначенным только для использования программами, написанными в среде дельфи, но тогда программы, написанные не в дельфи не смогут обращаться к этой функции.

exports

MyFunc INDEX 1 NAME "MathFunc";

Раздел Exports помогает компилятору и компоновщику создать специальный заголовок DLL-модуля, в котором перечисляются имена подпрограмм и адреса их точек входа. В DLL может быть несколько списков Exports, но перечисляемые в них подпрограммы должны быть описаны где-то выше по тексту библиотеки. Помимо имени подпрограммы в заголовок DLL помещается также ее порядковый

номер (INDEX), точнее, присвоенный ей целочисленный индекс. Это позволяет вызывающей программе ссылаться не на имя, а на индекс подпрограммы и тем самым уменьшить затраты времени на установление с ней связи. Индекс присваивается подпрограмме по порядку ее появления в списках Exports: первая подпрограмма в первом списке получает индекс 0, следующая 1 и т. д.

Программист может изменить умалчиваемую индексацию и явно указать индекс подпрограммы, добавив за ее именем в списке Exports слово index и целое число в диапазоне от 0 до 32767. Помимо индекса можно указать также и произвольное (NAME) имя функции.

Надеюсь, я понятно обьяснил ;) Вобщем наша демонстрационная библиотека готова. Теперь давайте научимся пользоваться библиотечными функциями

Использование библиотечных функций

Использовать функции из библиотеки можно двумя способами:


Информация о работе «DLL и Дельфи»
Раздел: Информатика, программирование
Количество знаков с пробелами: 13456
Количество таблиц: 0
Количество изображений: 0

Похожие работы

Скачать
2808
0
0

... окне редактирования кода? Вот эти файлы содержат как раз эти схемы, которые можно создавать в том окне. .DFM - Delphi Form File: здесь в двоичном виде хранится описание формы и компонентов, которая эта форма содержит .~DF - Резервная копия файла формы: в большинсте случаев она бесполезна, зря засоряет винчестеры. Так что гнать в шею! (точнее отключить в настройках :) .DOF - Delphi Options File: ...

Скачать
14798
0
0

... Можете ли вы предсказать результат выражения '1'+ '2'+3? Если вы сказали '6', то вы тоже попались. Посмотрим повнимательнее, '1'+ '2' будет... конечно '12', 12+3=15. Это и есть правильный ответ. Итак, мы увидели семь чудес Delphi, семь - из многих. Это не значит, что они - самые яркие или самые чудесные. Но на них можно многому научиться. Возьмем последнее, только что рассмотренное нами, чудо. ...

Скачать
14641
2
10

... в базе данных упрощает поиск необходимых данных. Наличие большого объема информации, которые требуются работникам различных организаций, оправдывает создание программистами баз данных, для удобства работы. Данная БД весьма актуальна для мастерских по ремонту бытовой техники.   1.2 Модель данных Реляционная модель данных описывает: 1.         структуры данных в виде наборов отношений, ...

0 комментариев


Наверх