plugins

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
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 »

:?:

Was hat das jetzt mit der DLL zu tun? Möchtest du das Form übergeben und darauf den Button durch die DLL erstellen lassen? Das wird so nicht gehen.
Erstelle den Buton lieber über ne Funktion in deinem Hauptprogramm.

Die DLL schickt eine Schlüsselanweisung an die Exe >> das Hauptprogramm erstellt den Button und legt die DLL-Funktion oder was auch immer auf ihn.

Ergo kannst du Forms aus der DLL löschen und alles ist bestens.
Johannes

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

Beitrag von theo »

@Monta, einen Versuch ist's doch wert oder?
@Hanibal: Du kannst die DLL/SO kompilieren wenn du die Pfade zu LCL aufnimmst: In Compiler Optionen -> andere Unit Dateien aus der Auswahlbox die Pfade zur LCL aufnehmen. Dann müsste es mindestens Kompilieren.
Dann müsste laut Hauptforum sowas möglich sein:

Code: Alles auswählen

library Project1;
 
{$mode objfpc}{$H+}
 
//Using Form in DLL or SO
 
uses
Classes,
Forms,
{ Unit Form } Form2;
 
 
 
procedure ShowForm2;stdcall;
begin
Form2 :=TForm2.Create(nil);//Create Form2 with NIL Owner
Form2.Show;
end;
 
function ShowModalForm2:integer;stdcall;
begin
Form2 := TForm2.Create(nil);//Create Form2 with NIL Owner
Result := Form2.ShowModal;
end;
 
export ShowForm2,
ShowModalForm2;
 
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 »

und warum ist da stdcall , und nicht das andere?

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 »

mhm, der compiliert das jezt, aber wnn man die function aus der lib startet, friert das fenster einfach ein :(

LIB:

Code: Alles auswählen

library test;
 
{$mode delphi}{$H+}
 
uses
  cthreads, Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, Buttons,
  ExtCtrls, StdCtrls, ComCtrls
  { add your units here };
 
function InitPlugin(param1,param2,param3,param4,param5,param6,param7,param8,param9,param10 : pchar; mainform : tform):boolean;stdcall;
var
Button: TButton;
begin
result := true;
Button:=TButton.Create(nil);
 with Button do
 begin
     Parent:=mainform;
     Caption:=string(param1);
     Left:=100;
     Top:=100;
 end;
end;
exports
InitPlugin;
 
begin
end.


Aufruf:

Code: Alles auswählen

type Tplugin= function (param1,param2,param3,param4,param5,param6,param7,param8,param9,param10 : pchar; mainform : tform):boolean;stdcall;
 
var
  PluginHandle :Thandle ;
  Plugin :tplugin;
 
procedure TForm1.Button9Click(Sender: TObject);
begin
pluginhandle:=LoadLibrary('libtest.so');
if pluginhandle<>0 then
begin
plugin:=Tplugin(GetProcAddress(pluginhandle,'InitPlugin'));
if Assigned(plugin) then
plugin(pchar('hallo'),pchar(''),pchar(''),pchar(''),pchar(''),pchar(''),pchar(''),pchar(''),pchar(''),pchar(''),form1)
else
ShowMessage('not assignet!');
FreeLibrary(pluginhandle);
end
else
ShowMessage('Library not found');
end;


warum funktioniert das nicht?

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

Beitrag von theo »

Weil das Beispiel von Windows stammt und dort ist stdcall üblich.
Unter Linux ist es Cdecl. Hast du das Wiki dazu nicht gelesen?

Warum's nicht funzt? Keine Ahnung. Kann viele Gründe haben.
Das ist keine einfache Sache. Ich würde das mal als experimentell bezeichnen, was du da machst.
Monta's Vorschlag war schon gut, ich wollte nur wissen, ob's nicht doch geht. ;-)

Wenn man wüsste, was du genau machen willst, könnte man dir auch bessere Tipps geben.
Eine andere Möglichkeit wäre z.B. Pascalscript zu benutzen.
Damit kann man die GUI Elemente auch aufbauen und braucht dann nur ein Scriptfile laden.
http://www.remobjects.com/page.asp?id={9A30A672-62C8-4131-BA89-EEBBE7E302E6}

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 vor meinen mediaplayer so aufzubauen, das man über plugins einen zusätzlichen button erstellen kann, der eine bestimmte funktion ausübt, das pascal scritp hört sich ganz interressant an, gucke ich mir mal an...

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 »

@theo ja, probieren schadet nicht, aber ich bin mal davon ausgegangen, das das in neueren Versionen auch nicht besser geht, und ich hing schonmal am selben Problem.

@hanibal: mach nen Pluginordner, wo du alle exen/dlls/so reinlegst. Und ne XML/Ini was auch immer mit rein, die die Buttoninformatinen enthält. Diese lädst du und erstellst fü jede Section in der Konfigurationsdatei nen Button/Menüeintrag. Die Lösung finde ich zumindest recht angenehm.
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 »

so ähnlich möchte ich dass auch machen, nur das jedes pluginn ne initfunktion enthält, wo dem programm zurück gegeben wird, welchen button der wo erstellen soll, und in welcher größe usw.

nur warum kann ich irgendwie keine tstringlist als parameter nehmen? da stürzt das programm einfach ab :(

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

Beitrag von theo »

hanibal hat geschrieben:nur warum kann ich irgendwie keine tstringlist als parameter nehmen? da stürzt das programm einfach ab :(


Immer schön Pchar und Integer und sowas nehmen.
Die Gründe sind ein bisschen kompliziert. Vielleicht hilft das:
http://wiki.lazarus.freepascal.org/shared_library

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, ok

PS: Das Funktioniert ja noch nicht ein mal mit einem array of pchar :(

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, geht doch, man muss das nur als rückgarbewert der funktion machen, und nicht innerhalb der klammern :)

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 »

wie kann man einen button zur laufzeti erstellen?

Code: Alles auswählen

var
 Button: TButton;
begin
 Button:=TButton.Create(Self);
 with Button do
 begin
     Parent:=Form1;
     Caption:='Alter Titel';
     Left:=100;
     Top:=100;
 end;


funktioniert nicht, es gibt keinen fehler, aber es passirt auch sonst gar nix :(

knight
Beiträge: 802
Registriert: Mi 13. Sep 2006, 22:30

Beitrag von knight »

Muß man da nicht noch einen Befehl zum Anzeigen des Buttons anfügen?

knight

Jagged
Beiträge: 20
Registriert: So 21. Okt 2007, 11:05

Beitrag von Jagged »

Hi


Normalerweise nicht, der Code ist auch soweit richtig. Eventuell hast Du ein Panel (oder ähnliches) drüber liegen?


Gruß,
Jagged.

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 »

oh, stimmt :oops:

aber wiso funzt OnClick:=Button2Click; nicht?

der sagt immer, das das zu wenige paramter sind

EDIT: hab das prob gefunden, da muss ein @ vor also
OnClick:=@Button2Click;

Antworten