![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как победить 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])