Заметки · 06.12.2024

Читай между полками

Внимание! Сейчас будет очередной пост про IDE Lazarus.

Начну с самого начала. Несколько месяцев назад потребовалось расширить функционал старого проекта. Разбираться в своём же коде и буреломе из модулей не было ни времени, ни возможности. Пришлось выкручиваться и снабдить проект постоянным спутником — динамически подключаемой библиотекой. Все нужные доработки я запихнул в dll, создал статическое подключение, пересобрал программу и вернул на сетевой ресурс.

И вот наконец-то появилось время рассказать, как написать простую библиотеку и подключить её к проекту.

Начну с создания самой библиотеки. Для примера состряпаем простую функцию SendMessage, которая принимает строку, добавляет к ней свои каляки-маляки и возвращает конструкцию назад. Добавим к функции соглашение о вызове cdecl (тётя Вика в курсе). В завершении отправим функцию на экспорт:

library project1;

{$mode objfpc}{$H+}

uses
  Classes;

{$R *.res}

// Основная функция библиотеки
function SendMessage(msg:string):string;cdecl;
begin
  result:='Сообщение от библиотеки: ' + msg;
end;

// Экспортируем функцию
exports
  SendMessage;

begin
end.

Если всё пойдет хорошо — функция должна будет вернуть строку вида Сообщение от библиотеки: <string>.

Обязательное отступление! В моём случае у проектов библиотеки и программы одно наименование — project1. Для демонстративного прогона заниматься неймингом совсем не хотелось. Да и, к тому же, выходные…

Теперь возьмёмся за программу, которая в процессе работы должна будет обратиться к библиотеке. Не мудрствуя лукаво, создаём проект «Приложение», кидаем на форму кнопку и добавляем к ней действие по клику.

Допустим, цель программы состоит в выводе сообщения, к содержимому которого функция SendMessage приложит свои механические ручонки. И всё, что нужно от пользователя — нажать на кнопку.

Поэзия закончилась. Теперь время сухой прозы: объявляем в блоке interface функцию из библиотеки и указываем, что она принадлежит именно этой библиотеке. И уже в процедуре Button1Click обращаемся к SendMessage.

unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls;

// Объявляем функцию из библиотеки
function SendMessage(msg:string):string; cdecl; external 'project1.dll';

type

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private

  public

  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

// Обращаемся к функции в библиотеке
procedure TForm1.Button1Click(Sender: TObject);
begin
 ShowMessage(SendMessage('Тестируем функцию из библиотеки!'));
end;

end.

Собираем приложение, запускаем и жмём на заветную кнопку:

Библиотека подключена и отлично взаимодействует с приложением.

Важно помнить, что теперь ваша библиотека — это неотъемлемая часть команды (и корабля). Куда бы не отправился ваш экзешник, библиотечка всегда должна следовать за ним.