Внимание! Сейчас будет очередной пост про 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.
Собираем приложение, запускаем и жмём на заветную кнопку:

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