Партнерка на США и Канаду по недвижимости, выплаты в крипто
- 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. Теперь проект можно компилировать, запускать и проверять результат.


