Zdravím, potřeboval bych poradit.
V Lazarusu zkouším udělat externí dll:
LIBRARY dll;
{$mode objfpc}{$H+}
USES
CLASSES,windows
{ you can add units after this };
function txt: String; stdcall;
BEGIN
txt:= 'pokus dll';
END;
exports
txt;
END.
Aplikace
UNIT UNIT1;
{$mode objfpc}{$H+}
INTERFACE
USES
CLASSES, SYSUTILS, FORMS, CONTROLS, GRAPHICS, DIALOGS, StdCtrls, DynLibs, FileUtil;
TYPE
{ TFORM1 }
TFORM1 = CLASS(TFORM)
LABEL1: TLABEL;
PROCEDURE FORMCREATE(SENDER: TOBJECT);
PROCEDURE FORMSHOW(SENDER: TOBJECT);
PRIVATE
PUBLIC
END;
VAR
FORM1: TFORM1;
pks: String;
IMPLEMENTATION
type
TMyDLL = function(): String; stdcall;
{$R *.lfm}
{ TFORM1 }
PROCEDURE TFORM1.FORMCREATE(SENDER: TOBJECT);
VAR LIB: TLibHandle;
DllFunc: TMyDll;
begin
LIB:= SafeLoadLibrary('dll.dll');
IF (LIB<>0) THEN
begin
DllFunc:= TMyDll(GetProcedureAddress(LIB,'txt'));
IF Assigned(DllFunc) THEN
begin
pks:= DllFunc();
end;
end;
FreeLibrary(LIB);
//UnloadLibrary(LIB);
end;
END;
PROCEDURE TFORM1.FORMSHOW(SENDER: TOBJECT);
BEGIN
Label1.Caption:= pks;
END;
END.
Dojede to v pohodě až k Label1.Caption:= pks; pak to vyhodí chybu:
Projekt aplikace vyvolal vyjímku třídy 'External: SIGSEGV'. na adrese 100008D9A
Assembler:
0000000100008D9A 48837b0800 cmpq $0x0,0x8(%rbx)
A i když poté zkusím např. Label1.Caption:= 'nějaký text'; tak to vždy vypíše stejnou chybu.
Když odmažu pks:=DllFunc(); a nechám Label1.Caption:= 'nějaký text';, tak už to chyba nevyskočí, ale samozřejmě to taky nic nenačte z dll. Nevíte prosím někdo, kde by mohla být chyba?
Díky