Я что-то делаю не так...
1. Код библиотеки:
Код: Выделить всё
library project1;
{$mode objfpc}{$H+}
uses
Classes
{ you can add units after this };
{$R simple.res}
{$R *.res}
function Add(a:Integer):Integer;cdecl;
begin
Result:=1+a;
end;
Exports
Add index 1 name 'Add';
begin
end.
Как создовали ресурс:
Код: Выделить всё
C:\lazarus\fpc\2.6.0\bin\i386-win32>windres.exe -i C:\s.rc -o C:\simple.res
Где C:\s.rc:
2. Динамическая загрузка:
Код: Выделить всё
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls,
StdCtrls,windows;
type
{ TForm1 }
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Image1: TImage;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ private declarations }
public
{ public declarations }
end;
var
Form1: TForm1;
implementation
function Add (a : Integer) : Integer; cdecl; External 'project1.dll';
{$R *.lfm}
{ TForm1 }
procedure TForm1.Button1Click(Sender: TObject);
begin
Caption:=IntToStr(Add(1));
end;
procedure TForm1.Button2Click(Sender: TObject);
var
h : THandle;
begin
h := LoadLibrary('project1.DLL');
try
if h <> 0 then
begin
Image1.Picture.Bitmap.LoadFromResourceName(h, 'B');
end
else
begin
ShowMessage('Load Resource DLL FAILED!');
end;
finally
FreeLibrary(h);
end;
end;
end.
Все работает.Статическая загрузка:
Код: Выделить всё
unit Unit1;
{$mode objfpc}{$H+}
interface
{$LINKLIB my}
uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls,
StdCtrls;
type
{ TForm1 }
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Image1: TImage;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ private declarations }
public
{ public declarations }
end;
var
Form1: TForm1;
function Add (a : Integer) : Integer; cdecl;
implementation
function Add (a : Integer) : Integer; cdecl; External;
{$R *.lfm}
{ TForm1 }
procedure TForm1.Button1Click(Sender: TObject);
begin
Caption:=IntToStr(Add(1));
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
Image1.Picture.Bitmap.LoadFromResourceName(HInstance, 'B');
end;
end.
Как делал статическую библиотеку:
1. Компилим при помощи Lazarus-a длл, он создает объектные файлы в папке C:\LoadLib\Lib\lib\i386-win32\.
2. Собираем при помощи ar:
Код: Выделить всё
c:\lazarus\fpc\2.6.0\bin\i386-win32>ar.exe -r C:\LoadLib\Lib\libmy.a C:\LoadLib\Lib\lib\i386-win32\project1.o C:\LoadLib\Lib\lib\i386-win32\project1.or C:\LoadLib\Lib\link.res
При компиляции программы, вываливается мол не определен _Add, задал в лоб:
Код: Выделить всё
function Add (a : Integer) : Integer; cdecl; External name 'Add';
не помогло.
Исходники