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

Вниз

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

 
vlv ©   (2002-11-14 16:26) [0]

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


 
Skier ©   (2002-11-14 16:29) [1]

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


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

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


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

Marcus (14.11.02 16:34)

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

С уважением,


 
vlv ©   (2002-11-14 16:43) [4]

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


 
Skier ©   (2002-11-14 16:48) [5]

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


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

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


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

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


 
Fantasist ©   (2002-11-14 21:24) [8]


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


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


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

Fantasist © (14.11.02 21:24)


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


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


 
Fantasist ©   (2002-11-15 23:47) [10]


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


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



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

> 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-22 00:05) [12]


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

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



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

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

Наверх




Память: 0.5 MB
Время: 0.012 c
14-4579
Anar
2002-11-11 21:33
2002.12.02
Где взять скрипт


3-4234
Михич
2002-11-14 13:59
2002.12.02
Маска в DBGrid


4-4674
SaS13
2002-10-21 17:11
2002.12.02
список ComboBox


1-4331
MsGuns
2002-11-21 12:30
2002.12.02
Динамическое изменение геометрии и позиции формы.


3-4260
mv
2002-11-14 22:49
2002.12.02
удалённая база данных