Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как победить Invalid class typecast в DLL [D5, Win2k]


id_privin ©   (2002-10-22 15:16:00) 

Есть DLL c экспортируемым объектом типа TA. У объекта есть свойство Storage типа ТStringList. Есть function getStorage : TStringList.
В приложении есть Query : TIBQuery и A : TA;

В приложении делаю так
A.getStorage.addObject("Foo",Query); //ok
Запускаю функции DLL
----

В Dll (Data : TDataSet)

index := Storage.IndexOf("Foo"); //ok index = 0
Data := Storage.Objects[index] as TDataSet; // Получаю exception
invalid class typecast

ShareMem включена.

Мастера как быть?


Игорь Шевченко   (2002-10-23 17:53:00) [1]


> TdataSet из DLL и TdataSet из Exe - это два разных класса,
> т.к.
> находятся в разных адресных пространствах


Бред


asmith   (2002-10-23 17:30:00) [2]

Вот как раз адресное пространство у них общее, а таблицы виртуальных методов (VMT) у каждого своя, так что приведение типов работать не будет В ПРИНЦИПЕ.


Wolf   (2002-10-22 17:25:00) [3]

2Bis

Вот как раз поможет!
TdataSet из DLL и TdataSet из Exe - это два разных класса, т.к.
находятся в разных адресных пространствах. Поэтому приводить нужно явно.


Bis   (2002-10-22 16:36:00) [4]

да если уж as не прошел, то прямое преобразование тоже не поможет


Wolf   (2002-10-22 16:11:00) [5]

Ты получишь access violation в этом случае и без DLL.

Кажется можно так.
Data:=TdataSet(Storage.Objects[index]);
Q:=data as TQuery; // или чего-то другое

или сразу
Q:=TQuery(Storage.Objects[index]);


Skier   (2002-10-22 15:56:00) [6]

>id_privin


> А без них как нибудь можно?


Отказаться от классов.


id_privin   (2002-10-22 15:55:00) [7]

А без них как нибудь можно?


Игорь Шевченко   (2002-10-22 15:47:00) [8]

В DLL и в приложении разная таблица классов. Для того, чтобы не мучиться, приложение и DLL надо скомпилировать с run-time пакетами.


id_privin   (2002-10-22 15:43:00) [9]

Пробовал. Тогда потом на любом методе типа Data.Open получаю access violation.


Wolf   (2002-10-22 15:33:00) [10]

Попробуй так
Data:=TdataSet(Storage.Objects[index])


Наверх

Титульная страница Поиск, карта сайта Написать письмо