plugins
-
- 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:
:?:
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.
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
@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:
@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.
-
- 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)
mhm, der compiliert das jezt, aber wnn man die function aus der lib startet, friert das fenster einfach ein
LIB:
Aufruf:
warum funktioniert das nicht?
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?
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}
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}
-
- 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:
@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.
@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 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
-
- 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)
wie kann man einen button zur laufzeti erstellen?
funktioniert nicht, es gibt keinen fehler, aber es passirt auch sonst gar nix
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