![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как правильно зарегестрировать класс.
Matveih1 © (2008-05-13 09:24:00)Добрый день. Есть основная программа и есть 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;
где я промазал?
Matveih1 (2008-05-13 12:30:00) [1]
> Pack.bpl пользует внешнюю rtl.bpl и в ней регистрируется
> класс, хост приложение использует прилинкованую rtl и поиск
> класса происходит в ней... решение скомпилировать хост приложение
> с пакетами, хватит одного rtl остальные можно выкинуть,
> но советую добавить и vcl т.к. RegisterClass(TForm2);
Помогло! Спасибо
Сергей М. (2008-05-13 10:20:00) [2]
> Slym © (13.05.08 10:18) [5]
Угу. Ты прав, конечно же rtl, а не RTTI.
Думал о Фоме, а написал про Ерему)
Slym (2008-05-13 10:19:00) [3]Ega23 © (13.05.08 10:11) [3]
TPersistentClass = class of TPersistent;
procedure RegisterClass(AClass: TPersistentClass);
Slym (2008-05-13 10:18:00) [4]Сергей М. © (13.05.08 9:31) [1]
собственный экз-р RTTI
причем тут RTTI? то что белее 1 копии ето верно, но копий rtl а не RTTI...
Pack.bpl пользует внешнюю rtl.bpl и в ней регистрируется класс, хост приложение использует прилинкованую rtl и поиск класса происходит в ней... решение скомпилировать хост приложение с пакетами, хватит одного rtl остальные можно выкинуть, но советую добавить и vcl т.к. RegisterClass( TForm2); ...
Сергей М. (2008-05-13 10:16:00) [5]
> Ega23 ©
Справка дает однозначный ответ:
The AClass parameter is the class that is descended from TPersistent
Ega23 (2008-05-13 10:11:00) [6]Кстати. Я любой потомок TPersistent могу зарегистрировать? Точнее, достаточно ли моему классу быть потомком TPersistent, если я его хочу зарегистрировать? Или ещё что-то нужно?
Игорь Шевченко (2008-05-13 09:53:00) [7]
> При загрузке bpl происходит регистрация класса
Я не совсем помню детали, но с регистрацией классов в инициализации загружаемых пакетов в какое-то время были проблемы. Поэтому проще предусмотреть отдельную, явно вызываемую функцию у пакета, которая будет заниматься регистрацией его классов после загрузки.
Сергей М. (2008-05-13 09:31:00) [8]
> где я промазал?
У твоего хост-приложения свой собственный экз-р RTTI, вот здесь ты и промазал.
Обеспечение единого экз-ра RTTI для всех модулей приложения достигается сборкой этих модулей с опцией использования рантайм-пакетов