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

Вниз

Как победить Invalid class typecast в DLL   Найти похожие ветки 

 
id_privin ©   (2002-10-22 15:16) [0]

Есть 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 включена.

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


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

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


 
id_privin ©   (2002-10-22 15:43) [2]

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


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

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


 
id_privin ©   (2002-10-22 15:55) [4]

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


 
Skier ©   (2002-10-22 15:56) [5]

>id_privin


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


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


 
Wolf ©   (2002-10-22 16:11) [6]

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

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

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


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

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


 
Wolf ©   (2002-10-22 17:25) [8]

2Bis

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


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

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


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


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


Бред



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

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

Наверх




Память: 0.48 MB
Время: 0.02 c
14-11402
Shadow
2002-10-03 20:31
2002.11.04
Даешь войну флудерам!!!!!!


3-11107
Kurmanbek
2002-10-16 08:59
2002.11.04
Как лечить базу IBase? Помогите pliz!


6-11355
AndrX
2002-09-01 19:47
2002.11.04
Как програмно выключить комп?


7-11503
White Tiger
2002-08-28 15:40
2002.11.04
Перенаправление вывода в файл


1-11287
Krez
2002-10-23 11:48
2002.11.04
Установка нового компонента