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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 29.03.2014, 14:46   #1
yaschenko
Пользователь
 
Аватар для yaschenko
 
Регистрация: 29.03.2014
Сообщений: 26
По умолчанию Помогите с формами в dll

Доброго времени суток!
Подскажите пожалуйста: При нажатии на кнопку я загружаю с помощью loadlibrary dll и отрываю из этой dll форму, как мне при закрытии формы вызванной из dll сразу же с помощью FreeLibrary выгрузить dll из памяти?
Отладка - это процесс осознания того, что программа делает только то, что ты написал, а не то, что ты хотел написать.
yaschenko вне форума Ответить с цитированием
Старый 29.03.2014, 14:51   #2
Streletz
Старожил
 
Регистрация: 03.01.2014
Сообщений: 2,870
По умолчанию

Цитата:
FreeLibrary выгрузить dll из памяти
Передайте в FreeLibrary handle dll.
В помощь: Динамическая и статическая загрузка DLL
Streletz вне форума Ответить с цитированием
Старый 29.03.2014, 14:59   #3
yaschenko
Пользователь
 
Аватар для yaschenko
 
Регистрация: 29.03.2014
Сообщений: 26
По умолчанию

я не знаю где мне написать FreeLibrary что бы именно после закрытия dll-ной формы освободить память. Что бы при следующем нажатии на кнопку у меня снова загружалась dll и открывалась форма.
Отладка - это процесс осознания того, что программа делает только то, что ты написал, а не то, что ты хотел написать.
yaschenko вне форума Ответить с цитированием
Старый 29.03.2014, 15:19   #4
Streletz
Старожил
 
Регистрация: 03.01.2014
Сообщений: 2,870
По умолчанию

Цитата:
Сообщение от yaschenko Посмотреть сообщение
я не знаю где мне написать FreeLibrary что бы именно после закрытия dll-ной формы освободить память. Что бы при следующем нажатии на кнопку у меня снова загружалась dll и открывалась форма.
FreeLibrary выгружает dll из памяти.
Если форма используется часто, то dll, возможно, имеет смысл выгружать при завершении работы программы. Либо при каждом её вызове снова загружать dll и после закрытия формы снова выгружать. Как-то так...
Streletz вне форума Ответить с цитированием
Старый 29.03.2014, 15:26   #5
yaschenko
Пользователь
 
Аватар для yaschenko
 
Регистрация: 29.03.2014
Сообщений: 26
По умолчанию

Цитата:
Сообщение от Streletz Посмотреть сообщение
FreeLibrary , при каждом её вызове снова загружать dll и после закрытия формы снова выгружать.
именно это мне и нужно, но я не знаю где где мне написать FreeLibrary что бы выгрузить dll при закрытии формы вызванной из dll.
Отладка - это процесс осознания того, что программа делает только то, что ты написал, а не то, что ты хотел написать.

Последний раз редактировалось yaschenko; 29.03.2014 в 15:29.
yaschenko вне форума Ответить с цитированием
Старый 29.03.2014, 15:28   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

dll знает, что окно закрылось, пусть и передает сообщение об этом, в обработчике которого выгружать
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 29.03.2014, 15:33   #7
yaschenko
Пользователь
 
Аватар для yaschenko
 
Регистрация: 29.03.2014
Сообщений: 26
По умолчанию

Аватар, Можете скинуть пример как это реализовать, третьи сутки интернет лопачу решение найти не могу?
Отладка - это процесс осознания того, что программа делает только то, что ты написал, а не то, что ты хотел написать.
yaschenko вне форума Ответить с цитированием
Старый 29.03.2014, 16:44   #8
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Покажите код взаимодействия проги и dll
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 29.03.2014, 17:58   #9
yaschenko
Пользователь
 
Аватар для yaschenko
 
Регистрация: 29.03.2014
Сообщений: 26
По умолчанию

Код основной программы:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var hLib:THandle;
    _Create:procedure(Parent:TComponent);
    _Show:procedure;
begin
hLib:=LoadLibrary('Project2.dll');
@_Create:=GetProcAddress(hLib,'FormCreate');
@_Show:=GetProcAddress(hLib,'FormShow');
_Create(Self);
_Show;
end;
Dll:
Код:
library Project2;

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

{$R *.res}

procedure FormCreate(Parent:TComponent);
begin
Form1:=TForm1.Create(Parent);
end;

Procedure FormShow;
begin
Form1.Show;
end;

exports
  FormCreate,
  FormShow;
begin
end.
Отладка - это процесс осознания того, что программа делает только то, что ты написал, а не то, что ты хотел написать.
yaschenko вне форума Ответить с цитированием
Старый 29.03.2014, 20:42   #10
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Примерно в этом направлении
Код:
library Project2;

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

{$R *.res}

procedure FormCreate(Parent:TComponent);
begin
  Form1:=TForm1.Create(Parent);
end;

Procedure FormShow;
begin
  Form1.Show;
end;

Procedure FormDestroy;
begin
  Form1.Free;
end;

exports
  FormCreate,
  FormShow,
  FormDestroy;

begin
end.


unit Unit2;

interface

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

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

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
const cMy_DLL_FormClose = WM_USER+1;
begin
  Action:=caHide;
  PostMessage(TWinControl(Owner).Handle,cMy_DLL_FormClose,0,0);
end;

end.

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

const cMy_DLL_FormClose = WM_USER+1;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
    procedure MyDLLFormClose(var Msg: TMessage); message cMy_DLL_FormClose;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

var hLib:THandle;

procedure TForm1.Button1Click(Sender: TObject);
var _Create:procedure(Parent:TComponent);
    _Show:procedure;
begin
hLib:=LoadLibrary('Project2.dll');
@_Create:=GetProcAddress(hLib,'FormCreate');
@_Show:=GetProcAddress(hLib,'FormShow');
_Create(Self);
_Show;
end;

procedure TForm1.MyDLLFormClose(var Msg: TMessage);
var _Destroy:procedure;
begin
  @_Destroy:=GetProcAddress(hLib,'FormDestroy');
  _Destroy;
  FreeLibrary(hLib);
end;

end.
Создавать вторую форму из dll, не закрыв первую этим кодом нельзя
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите разобраться с дополнительными формами Snezhok2101 Помощь студентам 5 27.12.2013 00:09
Взаимодействие между формами в dll RUSlan48 Общие вопросы Delphi 2 01.03.2011 22:40
помогите с формами HHHHH Помощь студентам 0 05.05.2009 17:55
Помогите понять. Работа с формами Vlad_sem PHP 5 02.12.2008 23:46
Помогите с формами! Sanek777 Общие вопросы Delphi 5 06.08.2008 20:36