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

Вниз

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

Наверх





Память: 0.46 MB
Время: 0.009 c
14-11447
Fog
2002-10-15 18:24
2002.11.04
Пора завязовать?


6-11356
MVova
2002-09-03 12:37
2002.11.04
Как узнать, свободен ли данный Socket порт на своей машине?


1-11178
Mav
2002-10-19 10:52
2002.11.04
Может мне кто нибудь объяснить ответ на мой вопрос популярно ???


14-11390
Nikolay M.
2002-10-16 17:50
2002.11.04
День Программиста - официальный выходной!


6-11362
BAHO
2002-09-03 00:39
2002.11.04
Трафик





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский