Форум: "Основная";
Текущий архив: 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