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

Вниз

Передача классов в Dll   Найти похожие ветки 

 
askall   (2002-09-18 20:02) [0]

Возникла такая требл. Прошу помощи.
Есть описание классов и в DLL и в основном модуле, например:
TObject -> class TLine -> TWLine.Какие-то методы и поля
есть поле Art : TObject;
есть метод Calulate
TObject -> class TArc -> TWArc.Какие-то методы и поля
есть поле Art : TObject;
есть метод Calulate

Передаю в Dll для обработки списком -> R.Count = 4;

В ходе выполнения проверяю (пробовал двумя способами!!!)
1. ClassRef:=TObject(R.Items[1]).ClassType;
if ClassRef=TWLine then ...
"..." не выполняется!!!!!!!!
(Значение ClassRef= в отладчике TWLine!!!!!)
2. if TObject(R.Items[1]) is TWline then ...
"..." не выполняется!!!!!!!!

А при обращение к методу, например:
TWline(R.Items[1]).Calculate;
begin
x:=TObject(Art).Name (Для примера)
end;

Проблемы:
1. Почему не определяется Classtype или возможно таких действий
нельзя выполнять в Dll?
2. Почему неполучается обратиться к полям?


 
askall   (2002-09-18 20:04) [1]

А при обращение к методу, например:
TWline(R.Items[1]).Calculate;
begin
x:=TObject(Art).Name (Для примера)
end;

Вываливает AcsessViolation в Dll?!


 
Юрий Зотов   (2002-09-18 21:25) [2]

EXE и DLL компилируются, как два независимых проекта. Поэтому таблица классов в каждом из них своя и класс TWLine в каждом из них - тоже свой. То есть, с точки зрения программы, это РАЗНЫЕ классы. Поэтому и не срабатывает ни сравнение классов, ни IS.

Самое простое и самое лучшее - вместо DLL используйте BPL. То есть, вместо DLL создайте run-time пакет и компилируйте EXE с включенной птичкой в опциях. Снимает все проблемы подобного рода.


 
Dimedrol   (2002-09-18 22:34) [3]

Я тоже решал проблему передачи данных в ДЛЛ.
Остановился на передаче УКАЗАТЕЛЯ в ДЛЛ через Messages.
Строил большую структуру данных, правдв это был большой
record, потом брал на него указатель и передавал
его библиотеке, к-рая разумеется, имела переменную
в точности такого же типа.

Как тебе такое ?


 
Юрий Зотов   (2002-09-18 22:36) [4]

Передача данных и передача объектов - вещи разные.


 
askall   (2002-09-19 10:48) [5]

>Самое простое и самое лучшее - вместо DLL используйте BPL.
Нет такоt мне не подходит. У меня одни объекты, а реализация методов различны и заложены в dll -> соответственно объект один реализация методов столько сколько dll, можно дописывать dll и будет новая релизация метода (dll регистрируется в основном модуле)
>Остановился на передаче УКАЗАТЕЛЯ в ДЛЛ через Messages.
Не подходит нужно работат с методами и полями объектов, а они обрабатывают ещё свои поля...

при инициализации передаю ссылки на основные коллекции классов
Там все нормально, но там не происходит определение какой это класс

А каким образом можно теоретически решить кроме BPL?


 
Andre V.   (2002-09-19 11:01) [6]

Опиши абстрактный класс в BPL и включай энтот в основной модуль и в DLL. А реализации на его основе сделай разные...
Так таблицы функций будут совпадать


 
Старый Паскалист   (2002-09-19 11:06) [7]

Теоретически, можно предпринять некоторые шаги, чтобы
классы в ДЛЛ со скрипом работали.

Не используй в методах RTTI: is, as, Assign.
Не используй в них же глобальных переменных.
Ещё лучше - чтобы ЕХЕ и ДЛЛ имели описание только абстрактных
объектов.
Уничтожай объекты там, где их создал - менеджер памяти в
ЕХЕ и в ДЛЛ может быть разный.
И ещё чего-нибудь, что я забыл.

Но всё это, ИМХО, изврат.

При этом запросто может получиться, что в ЕХЕ и в ДЛЛ объекты
будут рзных версий - долго потом глюки искать будешь.

PS А чем тебе bpl-то не нравятся? - ты объясни,
может, окажется, что ты в bpl чего-то не понимаешь.


 
AlexT1000   (2002-09-19 12:10) [8]

вопрос в дополнение.
а как думаете если в ДЛЛ Sharemem включить. могут таблицы объектов быть одними о теми же?
ведь память одна .

мож ему это поможет?!


 
Старый Паскалист   (2002-09-19 12:16) [9]

AlexT1000 (19.09.02 12:10)
Нет.


 
Mystic   (2002-09-19 12:21) [10]

интерфейсы


 
Юрий Федоров   (2002-09-19 13:07) [11]

Интерфейсы для этого и сделаны, так что вариант всего один


 
Юрий Зотов   (2002-09-19 13:16) [12]

Интерфейсы - это, конечно, бесспорно. Но вариант не единственный, можно и с BPL.

1. Делаем run-time пакет с каким-то (можно абстрактным) классом. Передаваемые объекты будут наследниками этого класса.
2. И Exe, и все DLL компилим с этим пакетом.


 
REA   (2002-09-19 14:09) [13]

Можно немного поподробнее про BPL?
А то с DLL у меня работает, но со скрипом, а интерфейсы почему-то неохота делать.
Будут ли у BPL и приложения общие RTTI и VMT?


 
Юрий Зотов   (2002-09-19 16:48) [14]

Да, будут. Это и есть самое главное преимущество BPL перед DLL. Второе важное преимущество - не дублируется код. Третье - можно свободно работать со строками, динамическими масивами, GetMem-FreeMem и пр. То есть все точно так же, как будто это один обычный проект.

Недостаток BPL - заточены только под Delphi-программы.


 
REA   (2002-09-19 17:03) [15]

Если планируешь передавать классы, то последний недостаток значения не имеет (а хочется именно это).
А какой аналог GetProcessAddress и Exports в BPL?


 
Юрий Зотов   (2002-09-20 00:54) [16]

А никакого. Просто указывате в Uses нужный юнит и все, что нужно, юзаете напрямую. Как в простой программе. Остальное разрулит компилятор.

В опциях проекта нужно проставить галку "compile with run-time packages" и добавить в список нужный пакет (или несколько пакетов). Все остальное - как обычно. И никаких Exports в BPL не нужно, достаточно вынести в секцию interface. Хоть классы, хоть процедуры, хоть типы, переменные, или константы. То есть все, как обычно.


 
REA   (2002-09-20 10:22) [17]

Это все зашибись работает, если статически линкуешь, а вот если надо использовать LoadPackage, то Exports и GetProcAddress работают как в обычной DLL, только вот и RTTI тоже как в обычной DLL - разные. При попытке добавить из DLL кнопку на форму фозникает "Cannot assign TFont to TFont". Есть варианты?



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

Форум: "Основная";
Текущий архив: 2002.09.30;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.014 c
1-98139
AlexT1000
2002-09-17 13:23
2002.09.30
Можно ли данный код считать универсальным деструктором


7-98382
Евген
2002-07-23 16:09
2002.09.30
Ввод значений в StringGrid из .csv файла


7-98371
elgato
2002-07-14 15:46
2002.09.30
Запустить процесс с привелегиями системы !


1-98040
NeyroSpace
2002-09-17 14:33
2002.09.30
Нужно узнать сколько файлов в каталоге, а потом поочереди открыть


3-97955
ang
2002-09-06 12:04
2002.09.30
Insert, Update с MS через ADO?





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