Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Взаимодействие приложения и dll


vlv ©   (2002-11-14 16:26:00) 

Есть dll, написанная на Delphi. И exe, написанная в C++Builder, которая импортирует функции из dll. Корректно ли будет вернуть из такой функции объект (в частности, TClientDataSet)?


Fantasist   (2002-11-22 00:05:00) [1]


> Вот о чем говорит Игорь Шевченко. Адресное пространство
> действительно одно, но ссылки TFont в Exe и в DLL указывают
> на РАЗНЫЕ места этого пространства. То есть, TFont в Exe
> и в DLL - это два РАЗНЫХ класса.

Правильно - это справедливо, если используешь RTTI. Очевидно что так как они компилятся отдельно, то и информация о типах у них у каждого своя. Во всех остальных случаях проблем не вижу. Типы скомпилированны одинаково - смещения до полей одно и то же, указатель на таблицу виртуальных методов находиться там же, статические методы выполняют то же самое.


Юрий Зотов   (2002-11-16 09:18:00) [2]

> Fantasist © (15.11.02 23:47)

F := TFont.Create;
if F is TFont then ShowMessage("Yes") else ShowMessage("No");

Очевидно, мы получим "Yes". Но если один из этих двух операторов находится в Exe, а другой - в DLL, то мы получим "No". Даже если и Exe, и DLL выполнены в одной среде, не говоря уже о разных.

Вот о чем говорит Игорь Шевченко. Адресное пространство действительно одно, но ссылки TFont в Exe и в DLL указывают на РАЗНЫЕ места этого пространства. То есть, TFont в Exe и в DLL - это два РАЗНЫХ класса.

А вот если вместо DLL использовать BPL, то все будет нормально.


Fantasist   (2002-11-15 23:47:00) [3]


> Каждый класс в Delphi (да и в CBuilder"е) имеет VMT


Правда что ли? :D Круто. :) :)


Игорь Шевченко   (2002-11-15 10:57:00) [4]

Fantasist © (14.11.02 21:24)


> Не понял это что имеется ввиду?


Каждый класс в Delphi (да и в CBuilder"е) имеет VMT


Fantasist   (2002-11-14 21:24:00) [5]


> Потому что VMT для TClientDataSet в EXE - это одно место
> адресного пространства, а VMT для TClientDataSet в DLL -
> это другое место адресного пространства.


Не понял это что имеется ввиду? Адресное пространство одно и то же для dll и загрузившего ее ехе. Или это в том смысле, что представление экземпляров класса в памяти различны, для Delphi и Builder"а? Это действительно вероятно, точно так же, есть вероятность, что для разных версий Delphi, смещения vmt будут другими. Так что передавать указатель на объект не стоит даже если и dll и exe будут писаться на Delphi, мало ли что.
ИМХО, самое универсальное - это интерфейсы. Тогда Delphi dll"шным объектом можно будет пользоваться не только в Builder но и в других средах/языках, где поддерживается такое понятие.


Starkom   (2002-11-14 20:42:00) [6]

гыгы, Delphi5 - Руководство разработчика (Тейксейра, Пачеко) рядом лежит :)) А я долго вспоминал, где я видел эти фамилии.


Starkom   (2002-11-14 19:31:00) [7]

Хмм, а не подскажете, что такое пакеты? (Ну, чайник я)
А то у меня подобный проект - туда-сюда(из Delphi-Dll в Builder-exe) вовсю передаются ссылки на объекты с помощью экспортных функций.
2 Skier: И можно поподробнее, что за упомянутая книга Пачеко и Тейксейры? (фамилии, вроде, знакомые)


Skier   (2002-11-14 16:48:00) [8]

>vlv
для объектов в DLL есть ограничения, можешь
почитать про них у Пачеко и Тейксейры...
На память цитировать не буду - боюсь наврать...
(Лучше пакеты, тем более что у тебя
Delphi и C Builder - они друг друга понимают :) )


vlv   (2002-11-14 16:43:00) [9]

То есть надо иметь гарантию, что дельфовый объект имеет такую же структуру, что и в C Builder? Примитивный пример у меня прошел, но exe был написан тоже на Delphi.


Игорь Шевченко   (2002-11-14 16:41:00) [10]

Marcus (14.11.02 16:34)

Потому что VMT для TClientDataSet в EXE - это одно место адресного пространства, а VMT для TClientDataSet в DLL - это другое место адресного пространства. И они ничего друг про друга не знают.
Skier прав: пакеты - рулез. Так как в пакете класс лежит в одном месте и все сслыки идут в это место.

С уважением,


Marcus   (2002-11-14 16:34:00) [11]

А почему бы и нет? Объект такой же указатель, как и все остальные, а поскольку DLL живет в адресном пространстве экзешника, то проблем быть не должно


Skier   (2002-11-14 16:29:00) [12]

>vlv
Ой, уж лучше пакеты...


Наверх

Титульная страница Поиск, карта сайта Написать письмо