plugins

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
hanibal
Beiträge: 369
Registriert: Sa 3. Mär 2007, 16:03
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Bramsche (Emsland)

plugins

Beitrag von hanibal »

hallo!

wie kann ich mit lazarus plugins einbinden und erstellen?

ich würde gerne meinen mediaplayer um ein plugin system ergenzen... . Nur leider habe ich keinen plan, wie ich das anstellen soll :(

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

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)
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

hanibal
Beiträge: 369
Registriert: Sa 3. Mär 2007, 16:03
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Bramsche (Emsland)

Beitrag von hanibal »

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 :(

hanibal
Beiträge: 369
Registriert: Sa 3. Mär 2007, 16:03
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Bramsche (Emsland)

Beitrag von hanibal »

ich habe jetzt die unit dynlibs gefunden, weiß aber nicht wie ich diese anwenden kann :(

hanibal
Beiträge: 369
Registriert: Sa 3. Mär 2007, 16:03
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Bramsche (Emsland)

Beitrag von hanibal »

so ich habe jetz was gefunden:

Code: Alles auswählen

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 :(

die .so datei:

Code: Alles auswählen

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;

Benutzeravatar
theo
Beiträge: 10927
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

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"

hanibal
Beiträge: 369
Registriert: Sa 3. Mär 2007, 16:03
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Bramsche (Emsland)

Beitrag von hanibal »

ahm dake, teste ich gelich sofort aus, bin gerade am essen

hanibal
Beiträge: 369
Registriert: Sa 3. Mär 2007, 16:03
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Bramsche (Emsland)

Beitrag von hanibal »

funktioniert trotzdem nicht, ist immer noch nicht asignet :(

Benutzeravatar
theo
Beiträge: 10927
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

Probier halt ein bisschen rum.
Vielleicht würde ich noch das exports vor das finale end. nehmen:

Code: Alles auswählen

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.

hanibal
Beiträge: 369
Registriert: Sa 3. Mär 2007, 16:03
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Bramsche (Emsland)

Beitrag von hanibal »

ah, danke das war der fehler! :)

was bewirkt dieses CDECL eigentlich?

Benutzeravatar
theo
Beiträge: 10927
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

hanibal hat geschrieben: was bewirkt dieses CDECL eigentlich?
Aufrufkonvention. http://de.wikipedia.org/wiki/Aufrufkonvention" onclick="window.open(this.href);return false;

Man kann die auch gleich für alle Prozeduren mit $CALLING setzen:
http://www.freepascal.org/docs-html/prog/progsu69.html" onclick="window.open(this.href);return false;

hanibal
Beiträge: 369
Registriert: Sa 3. Mär 2007, 16:03
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Bramsche (Emsland)

Beitrag von hanibal »

achso, danke. das brauche ich also, wenn man auch plugins in z.B. C screiben will, oder?

und wie kann man vom plugin aus z.B. einen button erstellen?

hanibal
Beiträge: 369
Registriert: Sa 3. Mär 2007, 16:03
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Bramsche (Emsland)

Beitrag von hanibal »

ähm, wiso kommt wenn man die libary compilirt, das er die unit forms nicht finden kann? ich brauche diese nämlich, um einen button zu erstellen.

monta
Lazarusforum e. V.
Beiträge: 2809
Registriert: Sa 9. Sep 2006, 18:05
OS, Lazarus, FPC: Linux (L trunk FPC trunk)
CPU-Target: 64Bit
Wohnort: Dresden
Kontaktdaten:

Beitrag von monta »

Wie willst du in ner DLL nen Button erstellen?

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.
Johannes

hanibal
Beiträge: 369
Registriert: Sa 3. Mär 2007, 16:03
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Bramsche (Emsland)

Beitrag von hanibal »

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 :(

Antworten