Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.06.2014, 10:56   #1
Alexandr17
Форумчанин
 
Регистрация: 10.12.2013
Сообщений: 227
По умолчанию DLL с формой и ее вызов динамически.

Как сделать свою DLL с формой и ее динамический вызов из проекта. Есть ли пример.
Alexandr17 вне форума Ответить с цитированием
Старый 15.06.2014, 11:46   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

http://www.programmersforum.ru/showthread.php?t=46633
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 16.06.2014, 05:08   #3
Alexandr17
Форумчанин
 
Регистрация: 10.12.2013
Сообщений: 227
По умолчанию

Код:
--DLL--
unit UnDllForms;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
Function TestForms(textbtn1, textbtn2, textdialog, resulttextmemo:PAnsiCHar):Boolean; StdCall;
var
  Form1: TForm1;

implementation

{$R *.dfm}
Function TestForms(textbtn1, textbtn2, textdialog, resulttextmemo:PAnsiCHar):Boolean; StdCall;
begin
  form1.Button1.Caption:=textbtn1;
  form1.Button2.Caption:=textbtn2;
  form1.Caption:=textdialog;
  if form1.ShowModal=mrok then begin
    resulttextmemo:=PAnsiCHar(form1.Memo1.Text);
    result:=true;
    form1.Close;
  end else begin
    result:=false;
    form1.Close;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  form1.ModalResult:=mrok;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  form1.ModalResult:=mrno;
end;

end.
library ProjectDll;

{ Important note about DLL memory management: ShareMem must be the
  first unit in your library's USES clause AND your project's (select
  Project-View Source) USES clause if your DLL exports any procedures or
  functions that pass strings as parameters or function results. This
  applies to all strings passed to and from your DLL--even those that
  are nested in records and classes. ShareMem is the interface unit to
  the BORLNDMM.DLL shared memory manager, which must be deployed along
  with your DLL. To avoid using BORLNDMM.DLL, pass string information
  using PChar or ShortString parameters. }

uses
  System.SysUtils,
  System.Classes,
  UnDllForms in 'UnDllForms.pas' {Form1};

{$R *.res}

exports TestForms;

begin
end.
--Project--
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
type tTestForms=Function(textbtn1, textbtn2, textdialog, resulttextmemo:PAnsiCHar):Boolean;
var
  TestForms:TTestForms;
  dll_instance: Thandle;
begin
  dll_instance:= LoadLibrary('ProjectDll.dll');
  @TestForms:=GetProcAddress(dll_instance, 'TestForms');
  if TestForms('OK', 'No', 'DIALOG DLL FORMS', paNSIchar(Caption)) then
    Form1.Caption:=Form1.Caption+';TRUE';
  FreeLibrary(dll_instance);
end;

end.
В итоге получаю это

Alexandr17 вне форума Ответить с цитированием
Старый 16.06.2014, 05:43   #4
ZuBy
Участник клуба
 
Аватар для ZuBy
 
Регистрация: 29.09.2008
Сообщений: 1,234
По умолчанию

А где создание форм?
ZuBy вне форума Ответить с цитированием
Старый 16.06.2014, 05:48   #5
Alexandr17
Форумчанин
 
Регистрация: 10.12.2013
Сообщений: 227
По умолчанию

Упс да а как создать ее если она существует
Alexandr17 вне форума Ответить с цитированием
Старый 16.06.2014, 05:52   #6
Alexandr17
Форумчанин
 
Регистрация: 10.12.2013
Сообщений: 227
По умолчанию

Вот теперь создаю форму.
Код:
Function TestForms(textbtn1, textbtn2, textdialog, resulttextmemo:PAnsiCHar):Boolean; StdCall;
begin
  Form1:= TForm1.Create(Application);
  form1.Button1.Caption:=textbtn1;
  form1.Button2.Caption:=textbtn2;
  form1.Caption:=textdialog;
  if form1.ShowModal=mrok then begin
    resulttextmemo:=PAnsiCHar(form1.Memo1.Text);
    result:=true;
    form1.Free;
  end else begin
    result:=false;
    form1.Free;
  end;
end;
Ошибки при вызове формы нет но ззато возникает ошибка при ее удалении.
Alexandr17 вне форума Ответить с цитированием
Старый 16.06.2014, 07:54   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Form1:= TForm1.Create(Application);
Зачем Application?
Ставь nil
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 16.06.2014, 14:32   #8
Alexandr17
Форумчанин
 
Регистрация: 10.12.2013
Сообщений: 227
По умолчанию

Не помагло. Все равно при зыкрытии dll формы программа зависает и выводится что программа не работает
Alexandr17 вне форума Ответить с цитированием
Старый 16.06.2014, 15:27   #9
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,543
По умолчанию

Цитата:
Код:
type tTestForms=Function(textbtn1, textbtn2, textdialog, resulttextmemo:PAnsiCHar):Boolean;
Код:
Function TestForms(textbtn1, textbtn2, textdialog, resulttextmemo:PAnsiCHar):Boolean; StdCall;
разные схемы управления стеком при вызове функции (stdcall и ???) =>разрушение стека => зависание и прочие проблемы.
описание должно быть одинаковым.
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 16.06.2014 в 15:31.
evg_m вне форума Ответить с цитированием
Старый 16.06.2014, 18:14   #10
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

Цитата:
схемы управления стеком
cоглашение о вызове.
eval вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с DLL c# (Вызов Формы из DLL) updaite C# (си шарп) 16 24.10.2013 05:48
Надстройка DLL (XLL) с формой для Excel (без VBA) Louken Microsoft Office Excel 6 09.10.2012 20:04
Работа с динамически созданной формой Airou C++ Builder 1 12.07.2011 10:58
работа с C# формой из C++ dll d2s1 Общие вопросы .NET 0 14.03.2010 00:44
Проблема с дочерней формой в DLL madmech Общие вопросы Delphi 3 09.06.2009 19:21