• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

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

    Запись на курс до 25 апреля. Получить промодоступ ...

Формы в Dll

  • Автор темы nikolasiii
  • Дата начала
Статус
Закрыто для дальнейших ответов.
N

nikolasiii

Доброго всем времени суток.
Использую модульную архитектуру при разработке приложений.
В модулях (dll) храню формы. dll подключаю динамически.
Приложения у меня MDI.
Модули я делаю чтобы exe-шник не раздувался и чтобы использовать одни и те же модули разными приложениями.
С модальными формами я разобрался, всё работает на "Ура!", а с формами MDI проблема.
Не очень хорошо представляю себе как можно работать с TApplication и TForm используя dll.
Прошу вас помочь мне. В инете мало чего есть по использованию MDI. Может для этого есть другие решения? Не знаю. Я решил сделать так. Хотя есть у меня один вариант, но после вызова формы не работает кнопка Tab на клавиатуре. Даже код могу показать код:

//вызывается после выгрузки dll
procedure MyDLLProc(Reason: Integer);
begin
if Reason = DLL_PROCESS_DETACH then
if assigned(App) then Application:=App;
end;

procedure FormCreate(var aApp:TApplication;aComp:TComponent);
begin
if not assigned(FrmAutorization) then
begin
DllProc:=@MyDLLProc;
if not assigned(App) then
begin App:=Application;Application:=aApp;end;
FrmAutorization:=TFrmAutorization.Create(aComp);
end;
end;

Заранее благодарен.
 
N

nikolasiii

Для: sax_ol

Спасибо.
В краце, если можно, что такое bpl и где про него можно поискать. Я так понимаю что это пакет.
 
N

nikolasiii

Для: sax_ol

Хорошо тем кто разбирается в английском. :)
И за это спасибо. Буду разбираться. :blink:
 
N

nikolasiii

Для: sax_ol

у меня ещё один вопрос.
почему не высвобождается память после HLib:=LoadLibrary(PChar(aPath));
хотя в конце я делаю FreeLibrary(HLib);
Это я заметил в диспетчере объектов. Каждый раз при вызове процедуры (именно при вызове LoadLibrary()) память уменьшается на 4 Кб.
 
N

nikolasiii

Для: sax_ol


Огромнейшее спасибо за подсказку (bpl) и за сайт.
Вы мне очень помогли.
Ура!
Я решил свою проблему с формами в модулях.
:blink: :) :D
 
G

Grumza

Доброго времени суток господа!!!

Случайно наткнулся на эту тему!! с такой проблемой сталкивался и у меня есть готовое хорошее решение!

======================================================================

Создаем главную форму, FormStyle =MDI Form;
Вот исходник моей формы


Код:
unit Main;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ExtCtrls, Menus, ComCtrls;

type
TInitProc  = procedure(App, Scr: integer); StdCall;
TDoneProc  = procedure; StdCall;
TCreateProc = function: integer; StdCall;

type
TfrmMain = class(TForm)
procedure Exit1Click(Sender: TObject);
procedure Cascade1Click(Sender: TObject);
procedure Arrange1Click(Sender: TObject);
procedure About1Click(Sender: TObject);
procedure Newlocal1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure NewDLL1Click(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
FLib	  : THandle;
InitPlugin : TInitProc;
DonePlugin : TDoneProc;
CreateMDI : TCreateProc;
public
{ Public declarations }
end;

var
frmMain: TfrmMain;

implementation

{$R *.DFM}

uses
About, MDILOC;

procedure TfrmMain.FormCreate(Sender: TObject);
begin
FLib := LoadLibrary(PChar('mdidll.dll'));
@InitPlugin := GetProcAddress(FLib, PChar('InitPlugin'));
@DonePlugin := GetProcAddress(FLib, PChar('DonePlugin'));
@CreateMDI := GetProcAddress(FLib, PChar('CreateMDI'));
InitPlugin(integer(Application), integer(Screen));
end;

procedure TfrmMain.FormDestroy(Sender: TObject);
begin
DonePlugin;
FreeLibrary(FLib);
end;

procedure TfrmMain.Exit1Click(Sender: TObject);
begin
Close;
end;

procedure TfrmMain.Cascade1Click(Sender: TObject);
begin
Application.MainForm.Cascade;
end;

procedure TfrmMain.Arrange1Click(Sender: TObject);
begin
Application.MainForm.ArrangeIcons;
end;

procedure TfrmMain.About1Click(Sender: TObject);
begin
TfrmAbout.Create(Application).ShowModal;
end;

procedure TfrmMain.Newlocal1Click(Sender: TObject);
begin
TfrmMDI_local.Create(Application);
end;

procedure TfrmMain.NewDLL1Click(Sender: TObject);
var X: TForm;
begin
X := TForm(CreateMDI);
end;


end.
--=========================================================

Естесно модуль самой формы


Код:
unit MDILIB;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Menus;

type
TfrmMDI_dll = class(TForm)
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
public
{ Public declarations }
end;

var
frmMDI_dll: TfrmMDI_dll;

implementation

{$R *.DFM}

procedure TfrmMDI_dll.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caFree;
end;

end.

--==========================================================
И модуль библиотеки которая грузит форму

Код:
library mdidll;


uses
SysUtils,
Classes,
Forms,
MDILIB in 'MDILIB.pas' {frmMDI_dll};

var
DA : TApplication;
DS : TScreen;

procedure InitPlugin(App, Scr: integer); StdCall;
var DA: TApplication; DS: TScreen;
begin
DS := Screen;
Screen := TScreen(Scr);
DA := Application;
Application := TApplication(App);
end;

procedure DonePlugin; StdCall;
begin
Screen := DS;
Application := DA;
end;

function CreateMDI: integer; StdCall;
begin
Result := integer(TfrmMDI_dll.Create(Application));
end;

exports
InitPlugin,
DonePlugin,
CreateMDI;

begin
end.

---=======================================================

При этом необходимо поставить галочку в свойствах пректа
Project -->Options -->Packages ----> Галочка (Build with runtime packages)

Всё должно работать как часики!!!


кому не понятно могу пояснить как главная форма передает свой скрин на форму из библиотеке!!
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!