Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.06.10;
Скачать: CL | DM;

Вниз

Не работает RTTI для объектов, экспортируемых из DLL   Найти похожие ветки 

 
Невидимка   (2002-05-28 09:26) [0]

Сделал программу с плагинами в виде DLL, которые представляют собой обложку для моих собственных объектов (в экспорте одна функция GetObject). Все работает нормально, но желательно бы воспользоваться RTTI, чтобы специально обрабатывать в программе один дочерний подкласс. Беда в том, что попытка вызвать оператор "as" дает EInvalidCast, хотя объект из DLL - 100% экземпляр именно этого класса (когда я делаю приведение через Pascal-style ChildClass(BaseClass) - все работает).
Так как можно задействовать RTTI для таких объектов? Мне не хочется заводить лишних полей или методов в базовом классе, так как эта обработка специфична лишь для одного приложения.


 
Dimka Maslov ©   (2002-05-28 10:35) [1]

И не будет работать. Операторы is и as не работают для объектов, импортированных из Dll. Оператор is в таких случаях надо заменять на проверку свойства ClassName (что сработает не всегда), а вот для замены оператора as другого способа нет


 
Shaman_Naydak ©   (2002-05-28 10:53) [2]

Честно говоря, мне непонятна схема, которую ты хочешь реализовать..
Если в основной программе хочешь использовать именно вызов специфического метода класса, описанного в DLL, то тогда у тебя в основной программе должна быть RTTI от этого класса, чтобы в него преобразовать оператором as.. Но тогда какой он Плагин? Или у тебя класс описан не в самом плагине, а в нем просто юзается??

Предлагаю плагины реализовать как BPL (те же DLL, только в профиль), грузить/выгружать их соответственно LoadPackage/UnloadPackage..

Кстати, напомню, что можно вызвать метод, описанный в published, по имени через MethodAddress

Удачи


 
Невидимка   (2002-05-29 13:19) [3]

2 Dimka Maslov:

Ясно, только ClassName не подойдет: там же иерерхия Base - SpecificBase - Child, а мне нужно выцепить все эти Child, которые принадлежат SpecificBase, а не Base. То есть фильтровать по предку, а не по дочерним классам.
Если я это определю, то затем буду принудительно использовать обычное приведение типов указателей (вместо as). То бишь "is" вполне достаточно.
Еще идеи?


 
Невидимка   (2002-05-29 13:32) [4]

2 Shaman
Схема очень простая.
Программа - универсальный конвертер данных. Плюс есть возможность вывода текстовой информации в окне программы и удобной работы с ней. Если плагин plain-текстовый (экспортирует класс BasicConverter), то строки выдаются в StringGrid подряд в одной колонке. Если плагин может давать extended-текстовый формат
(дополнительная разметка и класс ExtendedConverter, порожденный от BasicConverter), данные выдаются в многоколонковый StringGrid с фильтрами вывода + фичи. Так вот, для отсеивания ExtendedConverter хочу использовать RTTI, а не хочу добавлять поле типа Style или Type в базовый класс. Естественно, приложение знает определения и BasicConverter и ExtendedConverter, только RTTI вообще почему-то не работает.

А пакеты дают RTTI?

Насчет MethodAddress спасибо. На первый взгляд выглядит интересно.


 
Игорь Шевченко ©   (2002-05-29 13:39) [5]

В UBPFD есть моя функция - IS по имени.

{ Возвращает true, если класс порожден от класса с именем Name }
{ Код является более эффективным, чем InheritsFrom или Is
и не требует привязки к RTTI определяемого класса }
function HSClassBasedOn (Value: TClass; const Name : String) : Boolean;
begin
Result := false;
while Value <> nil do begin
if SameText(Value.ClassName, Name) then begin
Result := true;
Exit;
end;
Value := Value.ClassParent;
end;
end;

С уважением,


 
Невидимка   (2002-05-29 14:53) [6]

Спасибо большое!

Про ClassParent-то я забыл. Срочно RTFM на TObject. :)

"IS" судя по ассемблеру более сложный, он по VTBL кажется лазиет.


 
Игорь Шевченко ©   (2002-05-29 14:54) [7]

Это только кажется :-)


 
Невидимка   (2002-05-29 15:26) [8]

А на самом деле? Какой там принцип?
Я точно не смотрел, просто когда дебажил, залез в асм.


 
Игорь Шевченко ©   (2002-05-29 15:28) [9]

system.pas _IsClass, _AsClass


 
Невидимка   (2002-05-29 16:04) [10]

Начинаю понимать...

Там действительно идет привязка к размещению объектов в памяти. Поэтому мои внешние объекты получаются изолированы.

Твой метод не привязан к памяти, поэтому эффективнее. По скорости, правда, проигрывает. Там код вылизан до блеска.
Поэтому эта штука полезна в случаях вроде моего.


 
Игорь Шевченко ©   (2002-05-29 16:10) [11]

Тут скорость никакой роли не играет.


 
Невидимка   (2002-05-29 16:25) [12]

Да это я так, для информации.
Спасибо тебе еще раз за код.
Кажется я заинтересовался потрохами VCL, займусь копанием на досуге.



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

Текущий архив: 2002.06.10;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.014 c
1-30850
antonyo
2002-05-29 11:00
2002.06.10
Что такое Canvas


1-30742
Great DAN
2002-05-30 12:10
2002.06.10
Печать


1-30817
начинающий програмер
2002-05-28 16:05
2002.06.10
Опять проблема с DLL!!!


14-30967
Ajax
2002-05-05 10:24
2002.06.10
Linux


3-30690
Koks
2002-05-16 10:55
2002.06.10
Группировка по дням недели