Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2002.06.10;
Скачать: [xml.tar.bz2];

Вниз

Не работает 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.005 c
1-30888
Great DAN
2002-05-29 11:37
2002.06.10
Записи типа RECORD


14-30980
mimino
2002-05-06 20:42
2002.06.10
Константы


4-31040
Question
2002-03-30 23:31
2002.06.10
Очень нужна помощь! (тяга к знаниям ;)


1-30912
Sniffer
2002-05-28 20:40
2002.06.10
Алгоритм


14-30992
Чужой
2002-04-22 11:27
2002.06.10
Значения в .INI файлах





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский