Panel из DLL(.SO) Ошибка. Помогите разобраться, Идея создать

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Panel из DLL(.SO) Ошибка. Помогите разобраться, Идея создать

Сообщение kaneghost » 18.08.2017 09:55:54

Есть такая идея сделать библитеку которая умеет создавать Виджет на основе
Tpanel и 2-х на ней Tlabel.
вот сама библиотека
Код: Выделить всё
{
  Example library
}
library subs;

{$mode objfpc}{$H+}

uses Forms, Classes, Controls, ExtCtrls, StdCtrls, Graphics, Interfaces,dialogs;

type

    { TWidget }

    TWidget = class (TPanel)
      private
      l1  : TLabel;
      l2  : TLabel;
      //colorr : TColor;
      public
      constructor Create (p : pointer; s1, s2 : string; colorrr : TColor);
      function UpdateValue(s:string):boolean;
      destructor Destroy;
    end;






  //TWidget.Create(p: TWinControl; s1, s2: string; colorrr: TColor),TWidget.UpdateValue(s: string): boolean,TWidget.Destroy();

{ TWidget }

constructor TWidget.Create(p: pointer; s1, s2: string; colorrr: TColor);
begin
   Inherited Create(tComponent(p));


   self.Color:=colorrr;
   //self.Owner:=p;
   //self.Width:=  round (Self.Parent.Width * 0.6);    // Ширина виджета относительно родителя
   //self.Height:= round (Self.Parent.Height * 0.5);  // Высота виджета относительно родителя
   self.Width:=22;
   self.Height:=22;
   self.Left:= 10;//round (Self.Parent.Width * WLeft);
   self.Top:= 50; //round (Self.Parent.Height * WTop);
   self.Caption:=s1;
   parent:=TWinControl(p);

   //ShowMessage('blablabla'+s1);
   //
   l1:=tlabel.create(self);
   l1.Parent:=self;
   l1.Font.Color:= clWhite;
   l1.AutoSize:=TRUE;
   l1.Caption:=s1;
   l1.Top:= round(self.Height*0.2);
   l1.Left:=round(self.Width*0.4);

   l2:=tlabel.create(self);
   l2.Parent:=self;
   l2.Font.Color:= clWhite;
   l2.AutoSize:=TRUE;
   l2.Caption:=s2;
   l2.Top:= round(self.Height*0.3);
   l2.Left:=round(self.Width*0.2);

   //self.Parent:=pointer(p);

end;

function TWidget.UpdateValue(s: string): boolean;
begin
  self.l2.Caption:=s;
end;

destructor TWidget.Destroy;
begin
  self.l2.Destroy;
  self.l1.Destroy;
  self.Free;

end;

function WidgetCreate(p:pointer;s,s2:string;tcol:tcolor):pointer;cdecl;export;
begin
  result:=TWidget.Create((p),s,s2,tcol);
end;
function WidgetUpdate(p:pointer;s:string):boolean;cdecl;export;
begin
  if assigned(twidget(p)) then
  begin
   twidget(p).l2.Caption:=s; exit(true)
  end

  else
   exit(false)
end;

exports
  WidgetCreate,widgetUpdate;

end.

вот Апликуха(программа) которая ее использует
Код: Выделить всё
{

unit testsubs;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
  ExtCtrls, dl, dynlibs;

type
  //{ TWidget }
  //
  //  TWidget2 = class (TPanel)
  //    private
  //    l1  : TLabel;
  //    l2  : TLabel;
  //    //colorr : TColor;
  //    public
  //    constructor Create (p : TWinControl; s1, s2 : string; colorrr : TColor);
  //    function UpdateValue(s:string):boolean;
  //    destructor Destroy;
  //  end;

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Label1: TLabel;
    Panel1: TPanel;
    procedure Button2Click(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;


Type
  Twidget =
    function (p:pointer;s,s2:string;tcol:tcolor):pointer;cdecl;

var
  Form1: TForm1;
  widget:tpanel;
implementation

{$R *.lfm}

{ TForm1 }



procedure TForm1.Button2Click(Sender: TObject);
var s1,s2,s3 : string;

    MyLibHandel:TlibHandle =dynlibs.NilHandle;
    ShowWidget:Twidget;
    path:string;
begin
   s1:= Edit1.Text;
   s2:= Edit2.Text;
   s3:= Edit3.Text;

   path:= ExtractFilePath(Application.ExeName) +'libsubs.so';
   MyLibHandel:=LoadLibrary(path);
   if MyLibHandel=0 then exit;

   ShowWidget:=Twidget(GetProcedureAddress(MyLibHandel,'WidgetCreate'));

   widget:=tpanel(ShowWidget(form1.panel1,s1,s2,clblue));




end;

end.


Ошибка возникает когда назначается у создаваемого объекта parent.
бьёмся с коллегами 3-й день. Либо убивается программа целиком. Либо вылетает Exception на 2782 строка в Conrol.inc . этом месте AParent.CheckChildClassAllowed(ClassType, True);.
kaneghost
незнакомец
 
Сообщения: 2
Зарегистрирован: 13.02.2015 14:41:08

Re: Panel из DLL(.SO) Ошибка. Помогите разобраться, Идея соз

Сообщение Лекс Айрин » 18.08.2017 10:31:36

kaneghost, на данный момент нельзя создавать компоненты из динамической библиотеки. Это ограничение самой среды. Просто в программе и в библиотеке используются разные экземпляры менеджера памяти.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 4089
Зарегистрирован: 19.02.2013 16:54:51

Re: Panel из DLL(.SO) Ошибка. Помогите разобраться, Идея соз

Сообщение zub » 18.08.2017 15:21:20

>>бьёмся с коллегами 3-й день
Осталось еще чуток побится. года 2-3-4-5, пока https://foundation.freepascal.org/projects/project-4 не запилят
zub
долгожитель
 
Сообщения: 2257
Зарегистрирован: 14.11.2005 23:51:26

Re: Panel из DLL(.SO) Ошибка. Помогите разобраться, Идея соз

Сообщение Alex2013 » 18.08.2017 16:31:06

Лекс Айрин писал(а):kaneghost, на данный момент нельзя создавать компоненты из динамической библиотеки. Это ограничение самой среды. Просто в программе и в библиотеке используются разные экземпляры менеджера памяти.


"Если нельзя но очень хочется то можно !" (С)народ
Нужно только "переключить контекст" ... я когда-то делал так: порождал класс от абстрактного класса ...
потом лепил реальный класс в длл (с абстрактным предком )... и добавлял функцию инициализации реального класса .
возвращающую ссылку "абстрактного типа" (который был общий для длл и основой программы ).
Работало хотя и с "причудами" и только в одинаковой среде (то есть если длл на делфи и основная программа на дельфи все ок а если длл на делфи а основная программа на лазарусе возникал обширный "привет в большого бодуна " ) .
Последний раз редактировалось Alex2013 18.08.2017 16:36:17, всего редактировалось 1 раз.
Alex2013
энтузиаст
 
Сообщения: 697
Зарегистрирован: 03.04.2013 11:59:44

Re: Panel из DLL(.SO) Ошибка. Помогите разобраться, Идея соз

Сообщение zub » 18.08.2017 16:33:05

>> я когда-то делал так: порождал класс от абстрактного класса ...
Не морочь людям голову. Ненадо так делать
zub
долгожитель
 
Сообщения: 2257
Зарегистрирован: 14.11.2005 23:51:26

Re: Panel из DLL(.SO) Ошибка. Помогите разобраться, Идея соз

Сообщение Alex2013 » 18.08.2017 16:37:08

zub писал(а):>> я когда-то делал так: порождал класс от абстрактного класса ...
Не морочь людям голову. Ненадо так делать

Работало же !
(Просто мысль качестве информации к размышлению ... почему бы и нет? :roll: )
ЗЫ
http://delphiru.ru/resources/48-adding-forms-to-a-dll
Последний раз редактировалось Alex2013 18.08.2017 16:49:28, всего редактировалось 1 раз.
Alex2013
энтузиаст
 
Сообщения: 697
Зарегистрирован: 03.04.2013 11:59:44

Re: Panel из DLL(.SO) Ошибка. Помогите разобраться, Идея соз

Сообщение zub » 18.08.2017 16:43:11

Тебе казалось что работало.

На данном этапе развития Lazarus-FPC лучше не заморачиваться. Появятся пакеты - тогда и будете распихивать всё по дллкам
zub
долгожитель
 
Сообщения: 2257
Зарегистрирован: 14.11.2005 23:51:26

Re: Panel из DLL(.SO) Ошибка. Помогите разобраться, Идея соз

Сообщение Alex2013 » 18.08.2017 16:53:36

Возможно ты прав... (в старых версиях Лазарус (до 1.0 ) фокус действительно не заработал (точнее как ты сказал "казалось что работает" ага иногда "в зависимости от фазы луны" ) в новых не пробовал, а в дельфи (с 5-й по 7-ю версии.. в более поздних не пробовал ) жило )
Alex2013
энтузиаст
 
Сообщения: 697
Зарегистрирован: 03.04.2013 11:59:44

Re: Panel из DLL(.SO) Ошибка. Помогите разобраться, Идея соз

Сообщение fedan » 25.08.2017 03:32:16

Если только под Windows, то можно попробовать собрать библиотеку, которая лежит в исходниках fpc по пути fpcsrc/rtl/win/fpcmemdll.pp и использовать sharemem в начале uses каждого проекта.
fedan
новенький
 
Сообщения: 26
Зарегистрирован: 15.09.2016 21:18:48

Re: Panel из DLL(.SO) Ошибка. Помогите разобраться, Идея соз

Сообщение zub » 25.08.2017 03:37:01

дело не только в менеджере памяти, сейчас dll и exe будут иметь 2 разных rtl
zub
долгожитель
 
Сообщения: 2257
Зарегистрирован: 14.11.2005 23:51:26


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: Сквозняк и гости: 6

Рейтинг@Mail.ru