Пример, модуль включаемый в 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, какую играет роль(если его не включить, то компилятор не ругается и но и форма не открывается!!!)?