![]() |
|
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]()
|
|
| 790 |
|
||||||||
|
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 25.5.2006 Репутация: нет Всего: нет |
Всем ку!
Появилась неожиданная проблема. Есть куча классов, наследуемых от TBaseClass например: TRaspred = class(TBaseClass) В приложении создаются экземпляры этих классов, заполняются данными, все дела. Потом передаются ф-ии из Dll:
где
в DLL в fnDAMain есть такой код:
{возвращает PBASECLASS. Но по факту указывает на объект класса TRaspred, и потом}
На этой строке появляется имсключение EInvalidCast с матом: Invalid type cast. Хотя! Если эту fnDAMain(ptrPS:PPS) вызывать не через DLL, а просто скомпилить в приложение, то все пучком. Смотрел адреса, куда указатели показывают. В приложении и DLL они совпадают. DLL подключал и явно и неявно. По-барабану. Та же ошибка. Что это может быть и как это исправить или обойти? |
||||||||
|
|||||||||
| Romikgy |
|
|||
![]() Любитель-программер ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7326 Регистрация: 11.5.2005 Где: Porto Franco Odes sa Репутация: 26 Всего: 146 |
А так если? -------------------- Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. |
|||
|
||||
| Snowy |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 192 Всего: 484 |
Ты хочешь передавать объекты в dll?
А где описан TBaseClass? И как ты создаешь наследника от него в dll? Не, так не пойдет. Если dll - юзай интерфейсы. А лучше юзай bpl. Там всё необходимое уже предусмотрено. |
|||
|
||||
| 790 |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 25.5.2006 Репутация: нет Всего: нет |
Не объект, а указатель на него. И в DLL работаю с указателями. TBaseClass описан в юните, кот-ый подключается как при компиляции приложения, так и при сборке dll. Наследник от него создается как
Пользовать интерфейсы и bpl нельзя, т.к. то приложение, кот-ое должно хорошо работать с этой dll, делелось моим начальником неск. месяцев и сдавать проект уже скоро. Если я ему предложу bpl и интерфейсы, он мне ничего хорошего не предложит в ответ Мне недавно подсказали, что стоит использовать какое-то ShareMem. Есть ли еще идеи, что делать? |
||||
|
|||||
| Snowy |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 192 Всего: 484 |
Не получится так.
TBaseClass в exe и TBaseClass в dll, в откомпиленом варианте это совсем разные классы. Ни о каком приведении и речи быть не может. Никакой шаремем тут не поможет. Либо интерфейсы, либо bpl. bpl не мешает использовать dll. По сути bpl - это dll с расширенными возможностями. |
|||
|
||||
| 790 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 25.5.2006 Репутация: нет Всего: нет |
Опа. Вот этого я и не подозревал. Спасибо за науку. Так значит bpl. Хорошо, поковаряюсь с этим. Кстати, а как бы вы решили эту проблему по сути? Т.е. надо, чтоб dll, подключенная приложением работала с объектами (деревом объектов), созданными в приложении |
|||
|
||||
| 790 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 25.5.2006 Репутация: нет Всего: нет |
или не dll, но что-то динамически подключаемое
|
|||
|
||||
| Snowy |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 192 Всего: 484 |
Если подключаемый модуль один, то я бы описание класса дал в нем.
Создание и заполнение в exe, использование в модуле. Если модулей несколько, то создаем третью bpl, в которой описываем класс. ехе и все подключаемые подключают этот третий модуль и используют класс. Это все для BPL. Если мы хотим остаться на dll, то тут другой принцип. Объекты мы не используем. Но! Мы можем передавать данные. Оптимально здесь подойдет сериализация. У тебя есть одинаково описанный клас в ехе и dll. Онинаковые проперти. Все одинаково по именам. Различаются они своим физическим местонахождением. Значит создаем наш объект. Сериализуем его в TMemoryStream. Загоняем данные в буфер. Передаём буфер dll-ке. Уничтожаем объект. В dll: Загоняем буфер в TMemoryStream. Создаём объект. Десериализуем объект из стрима. Используем. Если твоё дерево наследуется от TConponent, то в нем уже зашита сериализация (SaveToStream). Если нет, то читай мою статью про TPersistent. |
|||
|
||||
![]()
|
| Правила форума "Delphi: Общие вопросы" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |