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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 08.12.2011, 22:36   #1
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию FindClass возвращает nil (Плагины)

Всем доброго. Появилась необходимость перевести один из проектов на плагинную систему, с тем чтоб не останавливая сам проект (он вращается на сервере, и выключение его для замены весьма напрягает) менять плуги, в случае их модификации.
Изначально думал использовать DLL, но решил еще покопать в сторону BPL.
Поскольку не занимался раньше пакетами в Делфи, сейчас получается нахожусь на стадии изучения.
Порывшись в инете нашел пару скудненьких описаний реализации плугов, и на основе их попробовал составить простенькую программулинку, имеющую вот такой вид:
Модуль главной формы:
Код:
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;

var
  Form1: TForm1;

implementation

{$R *.dfm}
 uses unit2;

procedure TForm1.Button1Click(Sender: TObject);
var h:HMODULE;
 t:Tm;
begin
 h:=LoadPackage('package1.bpl');
 t:=Tm(FindClass('tm2'));
 t:=t.Create(nil);
 Caption:=t.me;
 t.Free;
 UnloadPackage(h);
end;

end.
Сам класс TM у меня шаблонный для остальных плугов и выглядит так:
Код:
unit Unit2;

interface

uses
  SysUtils, Classes;

type
  Tm = class(TDataModule)
  private
    { Private declarations }
  public
    { Public declarations }
    function me:String; virtual; abstract;
  end;

implementation

{$R *.dfm}

end.
Его наследует плуг:
Код:
unit Unit3;

interface
 uses Unit2,classes;

 type
  Tm2 = class(Tm)
  private
    { Private declarations }
  public
    { Public declarations }
    function me:String;
  end;

implementation

{ Tm2 }


function Tm2.me: String;
begin
 Result:='34';
end;

initialization
 RegisterClass(tm2);
end.
Я правильно понимаю - RegisterClass(tm2); должен зарегистрировать на момент работы программы такой класс. Далее сам вызов FindClass должен мне вернуть указатель на класс, после чего я могу создать экземпляр и работать с ним?

Судя по всему я не учитываю еще чего-то, ибо FindClass не находит зарегистрированного класса.
Вопрос - Чего еще я не учел?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 09.12.2011, 00:53   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Stilet, по этой ссылке есть инфа по созданию bpl-плагинов с другим способом регистрации классов
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 09.12.2011, 00:59   #3
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

> FindClass('tm2')

оно, по-моему, кейс-сенситивное

UDP. Да, оно вызывает IndexOf() у стринглиста, так что должно быть как в исходнике:

Код:
FindClass('Тm2')
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."

Последний раз редактировалось veniside; 09.12.2011 в 01:04.
veniside вне форума Ответить с цитированием
Старый 09.12.2011, 09:30   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Цитата:
оно, по-моему, кейс-сенситивное
И так я тоже пробовал, результат тот-же. Скорее всего я неверно плуг оформил, но вот где неверно...
Цитата:
Аватар
За ссыль спс, я на нее вчера наткнулся, но уж больно спатки хотелось.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 09.12.2011, 10:20   #5
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,442
По умолчанию

У GunSmooker'а целая эпопея на эту тему есть в блоге "Реализация системы плагинов" из 11 частей.
Жаль не законченная, но все же может быть вам и поможет.

Последний раз редактировалось Человек_Борща; 09.12.2011 в 10:23.
Человек_Борща вне форума Ответить с цитированием
Старый 09.12.2011, 10:31   #6
Slym
Участник клуба
 
Регистрация: 07.12.2011
Сообщений: 1,025
По умолчанию

Главное приложение должно быть Build with runtime packages
Не стесняемся, плюсуем!
Slym вне форума Ответить с цитированием
Старый 09.12.2011, 10:34   #7
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

Код:
TformPclass =class of Tform4;

Tform5 =class(TForm4);
Код:
procedure TForm1.Button2Click(Sender: TObject);
var
  h: HWND;
  f: TForm4;
  cl: TFormPclass;
begin
  h:=LoadPackage('package2.bpl');
  if h=0 then begin
    showmessage('qqqqqqqqqqq');
    exit;
  end;
  cl:=TFormPclass( findclass('TForm5') );
  f:= cl.Create(self);
  f.show;
end;
Project.Exe Options -> Package -> Buid width run-time
отметка стоит? если нет, то надо поставить.
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 09.12.2011 в 10:47.
evg_m вне форума Ответить с цитированием
Старый 09.12.2011, 12:26   #8
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

> Build with runtime packages

кстати, да. В списке рантайм пакаджей должен быть rtl. Причём и проложение и плагин должны быть с вынесенным рантаймом, иначе получается, что они работают со своей копией Classes.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
FindComponent возвращает nil при поиске компонентов на TabbebNoteBook [MoNAMur] Компоненты Delphi 2 30.06.2011 15:58
Запись nil Vladi_88 Помощь студентам 2 18.04.2011 12:48
Запрос возвращает пустую таблицу, если один из подзаросов возвращает пустую таблицу ArtInt SQL, базы данных 9 12.05.2010 15:40
проверка на nil kate158 Общие вопросы Delphi 2 07.12.2009 16:26
FindWindow('TMainForm',nil) а дальше куча одноименных кнопок Стелс Win Api 17 01.11.2008 01:27