Help: Загрузка формы из DLL...

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

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

Help: Загрузка формы из DLL...

Сообщение Роман1971 » 19.07.2007 10:12:09

Проблема, не могу нормально загрузить форму из DLL.
Пример, модуль включаемый в DLL:
Код: Выделить всё
unit uBaseParLib;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, Menus,
  ExtCtrls, ComCtrls, StdCtrls, Buttons, Windows, Interfaces, LCLClasses;

type

  { TfBaseParLib }

  TfBaseParLib = class(TForm)
    btOk: TButton;
    btCancel: TButton;
    leUserName: TLabeledEdit;
    lePassword: TLabeledEdit;
    leRole: TLabeledEdit;
    leBasePath: TLabeledEdit;
  private
    { private declarations }
  public
    { public declarations }
  end;

var
  fBaseParLib: TfBaseParLib;

procedure ShowParam; export; stdcall;
//procedure ShowParam(AppH: TApplication ); export; stdcall; {вариант Delphi}

implementation

procedure ShowParam; export; stdcall;
//procedure ShowParam(AppH: TApplication ); export; stdcall;{вариант Delphi}
begin
//Application.Handle:=AppH;{вариант Delphi}
fBaseParLib:=TfBaseParLib.Create(Application);
fBaseParLib.ShowModal;
fBaseParLib.Free;
end;

initialization
  {$I ubaseparlib.lrs}

end.                                         

Объявление в DLL:
Код: Выделить всё
ibrary prBaseParLib;

{$mode objfpc}{$H+}

uses
  Classes, uBaseParLib;

Exports
  ShowParam name 'SHOWPARAM';
begin
end.               

В коде видно, что в варианте под Delphi я передаю в загружаемую функцию дескриптор приложения (Applicaton.Handle) вызвавшего библиотеку и делаю присвоение Application.Handle:=AppH, после чего в Delphi всё работает, форма открывается и после закрытия управление возвращается в вызывающую программу.
В Lazarus, мне не удалось в Application обнаружить свойство Handle... :-( Результат печален, при осуществлении метода ShowModal форма появляется, но при этом невозможно на ней ничего нажать кроме одного элемента(первого в списке активных по Tab) и форму невозможно закрыть... :-(
Вопрос:
    Как в Lazarus правильно загрузить и открыть форму из DLL?
    В чём отличия от Delphi?
    Свойство Application.Handle в Lazarus отсутствует или я не там искал?
    Модуль Interfaces, какую играет роль(если его не включить, то компилятор не ругается и но и форма не открывается!!!)?
Роман1971
новенький
 
Сообщения: 69
Зарегистрирован: 30.05.2007 09:14:53

Сообщение v-t-l » 20.07.2007 20:56:14

У тебя в dll свой отдельный объект Application. Попробуй передать Application вызывающего приложения и присвоить его переменной Application в dll.

Кстати, Application.Handle в Delphi - это дескриптор главного окна приложения (HWND), а не объект класса TApplication.
v-t-l
энтузиаст
 
Сообщения: 734
Зарегистрирован: 13.05.2007 16:27:22
Откуда: Belarus

Сообщение Роман1971 » 23.07.2007 08:52:51

Пробовал, не помогло....
Ошибка "SIGSEGV"
Ещё какие предложения будут, а то ситуация какая-то неестественная складывается, все функции и процедуры можно вызвать из DLL, а конструктор визуального класса - нет... :-(
Роман1971
новенький
 
Сообщения: 69
Зарегистрирован: 30.05.2007 09:14:53

Сообщение Cheb » 23.07.2007 18:07:05

Классы не должны пересекать границу DLL, поскольку у приложения и DLL у каждого своя RTL, своя RTTI, свой диспетчер памяти... Если попытаться обратиться к объекту в DLL (и наоборот) - всё превратится в кашу.

Не знаю о возможных путях обхода, кто-то говорил мне, что можно сделать через интерфейсы. Но обращение к объекту напрямую - никогда.
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 994
Зарегистрирован: 06.06.2005 15:54:34

Сообщение debi12345 » 23.07.2007 19:58:24

Ждите, когда появятся "FPC-packages". Они призваны решить именно эту проблему.
Аватара пользователя
debi12345
долгожитель
 
Сообщения: 5759
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Сообщение Роман1971 » 24.07.2007 10:04:20

Cheb писал(а):Классы не должны пересекать границу DLL, поскольку у приложения и DLL у каждого своя RTL, своя RTTI, свой диспетчер памяти... Если попытаться обратиться к объекту в DLL (и наоборот) - всё превратится в кашу.

Не знаю о возможных путях обхода, кто-то говорил мне, что можно сделать через интерфейсы. Но обращение к объекту напрямую - никогда.

Не возражаю, но в Delphi это всё работает без проблем. Там передаёшь дескриптор Application.Handle и всё "Ок"...
Просто присвоение Application(из DLL):=Application(из Main) не помогло...
Будем ждать FPC-packages, раз обещают...
Роман1971
новенький
 
Сообщения: 69
Зарегистрирован: 30.05.2007 09:14:53


Вернуться в Lazarus

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 23

Рейтинг@Mail.ru