Партнерка на США и Канаду по недвижимости, выплаты в крипто

  • 30% recurring commission
  • Выплаты в USDT
  • Вывод каждую неделю
  • Комиссия до 5 лет за каждого referral

2. Создание DLL

Пример

Требуется создать DLL, которая содержит функцию, реализующую сложение двух чисел. Дадим этой функции имя Summ.

Решение

Файл с кодом DLL представляет собой отдельный файл, который создается в Delphi как от­дельный проект.

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

1. Вы­брать меню File|New|Other. В окне создания нового проекта нужно вы­брать на вкладке New пункт DLL Wizard. Выберите этот пункт и нажмите кнопку ОК.

Несмотря на то, что мы выбрали DLL Wizard (слово Wizard говорит о том, что должен запуститься мастер), будет просто создан пустой проект с одним только модулем. Модуль содержит следующий текст (коммента­рии опущены):

library Project2;

uses

SysUtils,

Classes;

{$R *.res}

begin

end.

Если открыть Менеджер проектов (меню View | Project Manager), то в окне вообще не будет видно ни одного модуля. Это потому что код, который вы видели выше, относится к самой библиотеке.

2. Выберите из меню File пункт Save All, и вам предложат сохранить только один проект и никаких модулей. Сохраните проект под именем

FirstDLLProject. После этого откройте файл проек­та FirstDLLProject. dpr с помощью блокнота и вы увидите тот же самый код.

3. Добавим в нашу библиотеку одну функцию с именем Summ. У этой функции будет два параметра в виде целых чисел, а возвращать она будет сумму этих чисел (листинг 1.1).

Листинг 1.1. Функция Summ

library FirstDLLProject;

uses

SysUtils,

Classes;

function Summ(X, Y : Integer) : Integer; StdCall;

НЕ нашли? Не то? Что вы ищете?

begin

Result := X + Y;

end;

exports Summ;

{$R *.res}

begin

end.

Внимание.

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

Все параметры, передаваемые в процедуры и в функ­ции, передаются через стек. Если не указать ключевое слово StdCall, то па­раметры будут передаваться способом, заложенным фирмой Borland. Этот способ работает быстрее, но он несовместим со стандартными правилами.

Если вы уверены, что к процедуре будут обращаться только программы, скомпилированные компиляторами фирмы Borland, то можете не ставить это ключевое слово. Но если библиотека будет выставлена на всеобщее исполь­зование или к ней будут обращаться программы сторонних разработчиков, то желательно ставить StdCall, иначе у программистов на языках Visual C++ или других языках будут проблемы. Желательно сделать для себя прави­лом— всегда ставить StdCall, потому что способ Borland дает незначи­тельный выигрыш.

После описания функции идет новое ключевое слово exports. После этого ключевого слова должны идти описания процедур, которые должны быть доступны внешним программам. Если нашу функцию Summ не описать в разделе exports, то мы ее не сможем вызвать из внешней программы.

4. Откомпилируйте проект (нажмите клавиши <Ctrl>+<F9> или выбе­рите из меню Project пункт Compile FirstDLLProject), чтобы создать нашу динамическую библиотеку.

Внимание

Можете не пытаться запускать проект, потому что это библиотека, и она не мо­жет выполняться самостоятельно. Так что, единственное, что вы можете уви­деть — ошибку.

5. Напишем программу, которая будет использовать написанную функ­цию из динамической библиотеки.

Для этого создайте новый проект простого приложения

(File|New|Application). На форму установите только одну кнопку и по событию OnClick этой кнопки напишите следующий код:

procedure TForm1.Button1Click(Sender: TObject);

var

r : Integer;

begin

r := Summ(10,34);

Application. MessageBox(PChar(IntToStr(r)), 'Результат функции Summ');

end;

Разберём этот код. В первой строчке вызывается функция summ с двумя числовыми параметра­ми. Результат записывается в переменную r. Вторая строка вы­водит окно с результатом.

Если попытаться откомпилировать проект, то ничего не выйдет. Компилятор Delphi скажет, что он не знает такой функции Summ. Мы должны показать Delphi следующее:

а) что это за функция;

б) где ее искать.

Решим первую задачу: покажем компилятору, что это за функция.

Для этого в разделе type после описания класса TForm1 (нашей главной формы) нужно написать следующую строку:

function Summ(X, Y :Integer) :Integer; StdCall;

По сути это такое же объявление функции, которое определено в биб­лиотеке, только здесь нет begin и end и самого кода процедуры. По этой строке Delphi узнает, что где-то существует такая функция Summ, у нее есть два параметра, и она должна вызываться стандартным вызовом.

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

function Summ; external ‘FirstDLLProject. DLL’ name ‘Summ’;

Здесь написано, что есть такая функция summ. После точки с запятой стоит ключевое слово external, которое говорит о том, что функция внешняя, не принадлежит программе. После этого слова указывается имя динамической библиотеки, где нужно искать функцию. Далее идет ключевое слово name, которое означает, что функцию надо искать по имени. После этого ключе­вого слова указывается точное имя функции в библиотеке.

6. Теперь проект можно компилировать, запускать и проверять результат.