Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
4-4666
Ricks
2002-10-20 15:10
2002.12.02
GradientFill


7-4655
dimod
2002-09-26 13:12
2002.12.02
Win9x. Определение порта подключения модема


14-4567
Николай Быков
2002-11-11 13:37
2002.12.02
Зачем я тут дурью маюсь уже несколько месяцев?


7-4640
vitnt2000
2002-09-30 07:36
2002.12.02
Как поменять скорость COM порта?


1-4507
Anatoly P
2002-11-20 07:54
2002.12.02
ToolButton Canvas?





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