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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 04.02.2008, 09:19   #1
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию Разработка PlugIn

Приветствую. Разрабатываю плагин, допустим есть программа в ней окно пустое, вызываю плагин в нем форма, на ней компоненты VCL. Так вот же не задача, как мне эту форму в длл разместить на форме моего приложения ? Добился помещения, но после UpdateWindow(); форма не отображает контролы, наверное из-за ShowWindow(); Есть варинаты отображения и т.п. Можно послушать идеи на счет этого, но меня интерисует наибольше то, как получить не хендл, а указатель на экземпляр окна (TForm) и свободно с ним работать в приложении.
BOBAH13 вне форума Ответить с цитированием
Старый 04.02.2008, 09:28   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А может лучше будет не с DLL а с BPL работать, я если не ошибаюсь там можно и MDI формы и вообще удобнее работать на много

Кстати вот со старых времен у меня примерчик остался про формы в ДЛЛках:

Это код главной формы:
Код:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
   procedure u(w:TWinControl); external 'project2.dll';
var     f:THandle;
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
u(Form1);
end;

end.
Это самой ДЛЛ
Код:
library Project2;

{ 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
  SysUtils,Controls,
  Classes,
  Unit2 in 'Unit2.pas' {Form2};
var f:TForm2;
{$R *.res}
procedure u(s:TWinControl);
begin
 f:=TForm2.CreateParented(s.Handle);

 //f.Parent:=s;
 f.Show;
end;

exports u;
begin

end.
Код формы в ДЛЛКе я не привожу он значения не имеет.
I'm learning to live...

Последний раз редактировалось Stilet; 04.02.2008 в 09:45.
Stilet вне форума Ответить с цитированием
Старый 04.02.2008, 09:59   #3
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Да спасибо, я на подобии такого и сделал, ну правда у меня немного больше кода получилось.
BOBAH13 вне форума Ответить с цитированием
Старый 07.02.2008, 18:22   #4
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Еще вопрос... думаю что знаю в чем проблема вообщем вот код:
Код:
library...

function GetIcon: TIcon; stdcall;
...

exports
  GetIcon name 'GetIcon';

...

program...

var
  GetIcon: function: TIcon; stdcall;

...
тут в процедуре гружу либу получаю адрес этой функции присваиваю getIcon и далее вызываю ее... но дело в том что TIcon которая в либе распалагается, я так пониаю, в другой области памяти ( не моего приложения ) поэтому так просто я не могу обращаться к вернувшемуся значению TIcon функции из либы. Как быть ? Как мне получить ссылку на класс из dll и спокойно его использовать ?
BOBAH13 вне форума Ответить с цитированием
Старый 07.02.2008, 18:42   #5
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Цитата:
Сообщение от BOBAH13 Посмотреть сообщение
....в другой области памяти ( не моего приложения )......
Ну, это, конечно, ерунда: сам принцип dll в том, что они "грузятся" в адресное пространство приложения, мало того, изо всех сил стараются сесть на один и тоже адрес.

Цитата:
Сообщение от BOBAH13 Посмотреть сообщение
Как мне получить ссылку на класс из dll и спокойно его использовать ?
Помнится, какие-то жуткие вещи были связаны с борландовскими классами в dll-ках, не уверен, что получится спокойно его использовать . А что касается класса, не совсем понял, нужен адрес самой реализации? он был где-то вначале переменной self, то ли по нулевому оффсету, то ли по четвертому, то ли по восьмому, уже точно не помню, отладчиком можно точно посмотреть, класс сразу видно по таблице методов.
B_N вне форума Ответить с цитированием
Старый 07.02.2008, 18:48   #6
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Я хочу получать классы ( ссылки ) из длл в свое приложение и использовать их как классы, которые созданные в моем приложении.
BOBAH13 вне форума Ответить с цитированием
Старый 08.02.2008, 08:09   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Я хочу получать классы ( ссылки ) из длл в свое приложение и использовать их как классы, которые созданные в моем приложении.
Для этого в либе пропиши Uses <Твоя главная прога-юнит>
Посмотри как у меня:
Код:
...
uses   
....
  Unit2 in 'Unit2.pas' {Form2};  
....
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 08.02.2008, 08:38   #8
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Вообщем ладно, походу никто ничего не понял что я хотел сделать. У меня была цель експортировать ссылки на классы графических файлов сделал чуть подругому. Т.к. файлы в ресурсах длл сделал так

Код:
procedure initialize; stdcall;
begin
  ...
  Icon := LoadIcon(hInstance, 'Name of Icon');
  BitMap := LoadBitMap(hInstance, 'Name of BitMap');
end;

procedure Finalize;
begin
  ...
  DeleteObject(Icon);
  DeleteObject(BitMap);
end;

// to get these variables
function GetIcon: HICON;
begin
  Result := Icon;
end;
остальное по аналогии... а в проге отрисовывал просто, DrawIconEx. Или TIcon.Handle := GetIcon; Вообщем как обычно сам спрашиваю, сам разбираюсь но всеравно спасибо
BOBAH13 вне форума Ответить с цитированием
Старый 09.02.2008, 00:21   #9
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

И опять вопрос допустим я экспортирую функцию из длл типа
Код:
function GetName: PCHAR;
begin
  Result := 'текст';
end;
и после вызова в программе типа
Код:
String := GetName;
и вот вопрос, после этого не будет утечки памяти строки GetName которая вернулась...
BOBAH13 вне форума Ответить с цитированием
Старый 09.02.2008, 00:45   #10
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

как нистранно, после закоментирования вызовов такой процедуры модуль при выходе выводил на 200 б меньше потерь
Код:
unit CheckMemory;

interface

implementation

uses
  Windows, Forms, SysUtils, Dialogs;

var
  HPs: THeapStatus;
  HPe: THeapStatus;
  lost: Integer;

initialization
   HPs := GetHeapStatus;

finalization
   HPe := GetHeapStatus;
   Lost:= HPe.TotalAllocated - HPs.TotalAllocated;
   if lost >  0 then
   begin
      MessageBox(Application.Handle, PCHAR(format('lostMem: %d',[ lost ])), '', 0);
   end;
    
end.
BOBAH13 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Разработка собственной ОС BOBAH13 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 150 31.12.2020 15:14
Разработка софта BlackOmen Фриланс 5 20.04.2008 22:34
Разработка проекта [Smarik] Софт 1 08.04.2008 17:22
Plugin и все что с этим связано Mitriy Win Api 9 13.12.2007 10:53
РАЗРАБОТКА DLL Leo Общие вопросы Delphi 2 26.10.2007 21:35