Вниз
Скачать: CL | DM;

Как правильно зарегестрировать класс.   Найти похожие ветки 

← →
Matveih1 ©   (2008-05-13 09:24) [0]

Добрый день. Есть основная программа и есть bpl. При загрузке bpl происходит регистрация класса

initialization
begin
 RegisterClass(TForm2);
end;


но основная программа не может найти класс Form2
var
ModuleP: HMODULE;
Intf: IMayIntf;
AClass: TComponentClass;
AObj: TComponent;
begin
ModuleP := LoadPackage("Pack.bpl");
 if ModuleP <> 0 then
 begin
   AClass := TComponentClass(FindClass("TForm2"));
    if Assigned(AClass) then
      AObj := AClass.Create(Self);
  end;


где я промазал?


← →
Сергей М. ©   (2008-05-13 09:31) [1]


> где я промазал?


У твоего хост-приложения свой собственный экз-р RTTI, вот здесь ты и промазал.

Обеспечение единого экз-ра RTTI для всех модулей приложения достигается сборкой этих модулей с опцией использования рантайм-пакетов


← →
Игорь Шевченко ©   (2008-05-13 09:53) [2]


> При загрузке bpl происходит регистрация класса


Я не совсем помню детали, но с регистрацией классов в инициализации загружаемых пакетов в какое-то время были проблемы. Поэтому проще предусмотреть отдельную, явно вызываемую функцию у пакета, которая будет заниматься регистрацией его классов после загрузки.


← →
Ega23 ©   (2008-05-13 10:11) [3]

Кстати. Я любой потомок TPersistent могу зарегистрировать? Точнее, достаточно ли моему классу быть потомком TPersistent, если я его хочу зарегистрировать? Или ещё что-то нужно?


← →
Сергей М. ©   (2008-05-13 10:16) [4]


> Ega23 ©


Справка дает однозначный ответ:

The AClass parameter is the class that is descended from TPersistent


← →
Slym ©   (2008-05-13 10:18) [5]

Сергей М. ©   (13.05.08 9:31) [1]
собственный экз-р RTTI

причем тут RTTI? то что белее 1 копии ето верно, но копий rtl а не RTTI...
Pack.bpl пользует внешнюю rtl.bpl и в ней регистрируется класс, хост приложение использует прилинкованую rtl и поиск класса происходит в ней... решение скомпилировать хост приложение с пакетами, хватит одного rtl остальные можно выкинуть, но советую добавить и vcl т.к. RegisterClass(TForm2); ...


← →
Slym ©   (2008-05-13 10:19) [6]

Ega23 ©   (13.05.08 10:11) [3]
TPersistentClass = class of TPersistent;
procedure RegisterClass(AClass: TPersistentClass);


← →
Сергей М. ©   (2008-05-13 10:20) [7]


> Slym ©   (13.05.08 10:18) [5]


Угу. Ты прав, конечно же rtl, а не RTTI.
Думал о Фоме, а написал про Ерему)


← →
Matveih1 ©   (2008-05-13 12:30) [8]


> Pack.bpl пользует внешнюю rtl.bpl и в ней регистрируется
> класс, хост приложение использует прилинкованую rtl и поиск
> класса происходит в ней... решение скомпилировать хост приложение
> с пакетами, хватит одного rtl остальные можно выкинуть,
> но советую добавить и vcl т.к. RegisterClass(TForm2);

Помогло! Спасибо



Страницы: 1 вся ветка

Скачать: CL | DM;



Память: 0.47 MB
Время: 0.012 c
2-1210146878
Alexei
2008-05-07 11:54
2008.06.01
Запуск ехе-файла из программы на основе полного пути к файлу


15-1208264009
Fasco
2008-04-15 16:53
2008.06.01
как сделать........


10-1146131557
Рустам
2006-04-27 13:52
2008.06.01
Ошибка создания COM объекта реализованного в виде службы


2-1210594045
smartleds
2008-05-12 16:07
2008.06.01
Коллеги , подскажите как при выводе вместо запятой ,


2-1210591316
Leo
2008-05-12 15:21
2008.06.01
Захват записи или распределение доступа к оной.




   Наверх