Форум: "Основная";
Текущий архив: 2002.12.02;
Скачать: [xml.tar.bz2];
ВнизВзаимодействие приложения и 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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.009 c