Dann mach dir nen Plan, du bist schliesslich der Programmierer. Meisst löst man sowas über Dynamisch Linkebare Bibliotheken (.dll im windows, .so im linux)
das ist mir schon klar, ich habe bei delphi auch schonmal mit dlls gearbeitet, aber das prob ist, damals habe ich sie direkt deklariert, aber jetzt habe ich da ja ein verzeichnis, und möchte auslesen, welche biblioteken da drin sind, und die dann laden, und den code ausführen. also mit "fest" eingebundenen biblioteken habe ich erfahrung, zumindest unter delphi. habe aber keine ahnung, wie ich diese nun zu einem späteren zeitpunkt laden kann
uses dynlibs;
type Ttest= function (test1 : string):string;cdecl;
procedure TForm1.Button9Click(Sender: TObject);
var Handle1 :Thandle ;
Compute:Ttest;
begin
Handle1:=LoadLibrary('libtest.so');
if Handle1<>0 then
begin
Compute:=Ttest(GetProcAddress(Handle1,'test'));
if Assigned(Compute) then
ShowMessage(Compute('du da!'))
else
ShowMessage('not assignet!');
FreeLibrary(Handle1);
end
else
ShowMessage('Library not found');
end;
das lässt sich auch compilieren, aber da kommt immer die "not assignet!'" meldung
library test;
{$mode objfpc}{$H+}
uses
Classes
{ add your units here };
function test(test1 : string):string;
begin
result := 'Hallo ' + test1;
end;
begin
end.
export
test;
Als erstes würde ich vielleicht mal versuchen, die Funktion in der DLL auch mit CDECL zu definieren.
Ob das mit dem String gut geht, weiss ich nicht genau (Referenzgezählt).
PChar wäre sicherer.
P.S. und schreib mal "exports" statt "export"
library test;
{$mode objfpc}{$H+}
uses
Classes
{ add your units here };
function test(test1 : Pchar):Pchar; cdecl;
begin
result := 'Hallo ';
end;
exports test;
begin
end.
Es gibt bei visuellen Komponenten in DLLs unter Lazarus noch erhebliche Probleme. Daher sind beispielsweise auch keine in DLLs eingebeteten Formulare möglich...würde mich nicht wundern, wenn das auch deinen Button unmöglich macht.
ich möchte den button nicht in der "dll" erstellen, sondern auf dem form meines progs... . das prob ist nur das er die unit forms nicht finden, deshalb kann er das alles nich compilieren