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

Вниз

Классы в DLL   Найти похожие ветки 

 
Beer ©   (2004-09-06 12:45) [0]

Доброе время суток!

 Есть .dll с описанием класса. Как создать в программе экземпляр этого класса? Как вызывать функции-члены класса? Как его потом удалить?

 С уважением


 
Reindeer Moss Eater ©   (2004-09-06 12:47) [1]

Зачем такая бессмыслица нужна?


 
Игорь Шевченко ©   (2004-09-06 12:53) [2]


>  Есть .dll с описанием класса


Использовать .bpl


 
Beer ©   (2004-09-06 12:53) [3]

Библиотека написана давно на С++. Нужно вот вызвать из Delphi. Возможно это или нет? Если да, то как?


 
Reindeer Moss Eater ©   (2004-09-06 12:57) [4]

Вряд ли автор ДЛЛ додумался до такого бреда - экспортирования экземпляров классов.


 
GuAV ©   (2004-09-06 13:08) [5]


> Библиотека написана давно на С++. Нужно вот вызвать из
> Delphi.

С++ классы не совместимы с Delphi.


 
Игорь Шевченко ©   (2004-09-06 13:10) [6]

Reindeer Moss Eater ©   (06.09.04 12:57) [4

В чем именно состоит бред ?


> Библиотека написана давно на С++. Нужно вот вызвать из Delphi.
> Возможно это или нет?


Смотря какие классы описаны и какие есть фукнции в библиотеки для работы с классами. Описание класса извлечь и использовать нельзя, если в Dll функция, возвращающая новый экзумпляр класса, то можно, описав класс-помощник в Delphi вызывать виртуальные методы класса, созданного в DLL. Подробнее было в журнале Delphi Magazine и в Borland"овском FAQ


 
Amoeba ©   (2004-09-06 13:12) [7]

Что-то на эту тему было в книге Тексейры и Пачеко.


 
Reindeer Moss Eater ©   (2004-09-06 13:13) [8]

В чем бред?
В том что модуль класса должен быть в uses как библиотеки, так и хост-приложения.

Возникает вопрос: а нафига вообще библиотека, если полезный код, ради которого мы её используем уже прикомпилирован в хост приложение?


 
Rouse_ ©   (2004-09-06 13:40) [9]

Может быть имеется ввиду не класс а интерфейс?


 
Игорь Шевченко ©   (2004-09-06 15:14) [10]

Reindeer Moss Eater ©   (06.09.04 13:13) [8]

С++ библиотеки прекрасно экспортируют классы, позволяя приложению создавать эти классы, работать с ними, и создавать наследников классов, объявленных и реализованных в DLL.
Точно также, как пакеты в Delphi позволяют это делать.


> Вряд ли автор ДЛЛ додумался до такого бреда - экспортирования
> экземпляров классов.


Почему бы матчасть не поучить ?


 
Игорь Шевченко ©   (2004-09-06 15:15) [11]

Reindeer Moss Eater ©   (06.09.04 13:13) [8]


> В том что модуль класса должен быть в uses как библиотеки,
> так и хост-приложения


В C++ декларация и реализация класса могут быть разнесены по .h и .cpp файлам.


 
Reindeer Moss Eater ©   (2004-09-06 15:22) [12]

И что дальше?

Берем Delphi и пробуем работать с такой библиотекой.
Если это и не бред, то маразм - точно.


 
Reindeer Moss Eater ©   (2004-09-06 15:24) [13]

В C++ декларация и реализация класса могут быть разнесены по .h и .cpp файлам.

И что нам это дает?
К библиотеке прикомпилируем и .h и .cpp, а к хост приложению только .h ?


 
Reindeer Moss Eater ©   (2004-09-06 15:35) [14]

С++ библиотеки прекрасно экспортируют классы, позволяя приложению создавать эти классы, работать с ними, и создавать наследников классов, объявленных и реализованных в DLL.
Точно также, как пакеты в Delphi позволяют это делать.


Почему только пакеты?
Это в той матчасти написано которую учить надо?
Delphi библиотеки не менее прекрасно экспортируют классы.


 
Игорь Шевченко ©   (2004-09-06 15:49) [15]

Reindeer Moss Eater ©   (06.09.04 15:35) [14]


> Delphi библиотеки не менее прекрасно экспортируют классы.


Пример в студию.

Только сначала договариваемся, что имеется в виду под "эскпортом классов".


> И что нам это дает?
> К библиотеке прикомпилируем и .h и .cpp, а к хост приложению
> только .h ?


Именно.


> Берем Delphi и пробуем работать с такой библиотекой.
> Если это и не бред, то маразм - точно.


А вот в Borland так не считают, иначе, вместо описания способа работы с классами в в библиотеках, написанных на C++, и условий, при которых эта работа возможна, отделались бы словами про бред и маразм.


 
Reindeer Moss Eater ©   (2004-09-06 15:51) [16]

Только сначала договариваемся, что имеется в виду под "эскпортом классов".

Я понимаю под этим экспортируемую функцию, возвращающую потомка TObject.
Пример кода надеюсь все же не нужен?


 
Игорь Шевченко ©   (2004-09-06 16:00) [17]

Reindeer Moss Eater ©   (06.09.04 15:51) [16]


> Я понимаю под этим экспортируемую функцию, возвращающую
> потомка TObject.
> Пример кода надеюсь все же не нужен?


Я надеюсь, проблема "cannot assign TFont to TFont" известна ? Из-за того, что описания классов дублируются в DLL и в EXE.


 
Reindeer Moss Eater ©   (2004-09-06 16:02) [18]

1. А к теме это каким боком?
2. Могут ли все таки Delphi-библиотеки экспортировать классы ?


 
Игорь Шевченко ©   (2004-09-06 16:07) [19]


> Я понимаю под этим экспортируемую функцию, возвращающую
> потомка TObject.


Я понимаю под этим именно экспорт класса. Как типа.


 
Игорь Шевченко ©   (2004-09-06 16:09) [20]


> 1. А к теме это каким боком?


Таким, что даже в случае работы с объектом, созданным в DLL, в основном приложении, возможность работы несколько ограничена.


> 2. Могут ли все таки Delphi-библиотеки экспортировать классы
> ?


Не могут.
Они могут экспортировать функции, возвращающие экземпляр объекта. Не более того.


 
Reindeer Moss Eater ©   (2004-09-06 16:13) [21]

возможность работы несколько ограничена.
Здесь я начинаю терять нить разговора. Если это возражение высказано мне, то я обратного и не утверждал. Скорее наоборот.
Экспортировать - легко и просто и прекрасно, а импортировать - бред и маразм.
Точнее создавать такие библиотеки большая бессмыслица.

"Экземпляр объекта" - то же ничего не понял. Что это такое.
И чем оно отличается от экземпляра класса. Тем более что в OP класс то же является объектом.

Ну да ладно. Для меня тема исчерпана.


 
Игорь Шевченко ©   (2004-09-06 16:21) [22]


> "Экземпляр объекта" - то же ничего не понял. Что это такое.
> И чем оно отличается от экземпляра класса.


Оговорился, имел в виду, разумеется, экземпляр класса.


 
IXT   (2004-09-06 16:43) [23]

А структуру экспортировать можно?


 
Reindeer Moss Eater ©   (2004-09-06 16:45) [24]

Можно, но не нужно.


 
Defunct ©   (2004-09-06 17:00) [25]

> Я надеюсь, проблема "cannot assign TFont to TFont" известна ?

У меня была проблема с Type Casting"ом в DLL.

Не работала конструкция Obj is TObject

Пришлось использовать Tag для определения типа импортируемого класса. Главное, что конструкция as прекрасно работает. А далее уже дело техники.


 
GuAV ©   (2004-09-06 23:04) [26]

Игорь Шевченко


> > Я понимаю под этим экспортируемую функцию,
>возвращающую
>> потомка TObject.
>
>
> Я понимаю под этим именно экспорт класса. Как типа.


а если понимать под этим экспортируемую функцию, возвращающую TClass?

IXT   (06.09.04 16:43) [23] [Новое сообщение][Ответить]

> А структуру экспортировать можно?

Структура состоит из описания только. Продублировав описание, её можно передавать. На передаваемые поля структуры те же ограничения, что и на передаваемые параметры. Более того обычно применяемое соглашение stdcall таково, что структуры передаются по значению. т.е. объявления
type
 TStruc = record
   A, B, C: Integer;
 end;

procedure X(R: TStruc); stdcall;
и
procedure Y(A, B, C: Integer); stdcall; совместимы с точки зрения способа передачи параметров.


 
Игорь Шевченко ©   (2004-09-08 15:33) [27]

GuAV ©   (06.09.04 23:04) [26]


> а если понимать под этим экспортируемую функцию, возвращающую
> TClass?


TClass есть ссылка на VMT внутри DLL. И что это даст ?
В пакетах (bpl) кстати, такие функции есть, но компилятор для всех функции работы с такими классами подставляет ссылки на соответствующие экспротируемые из пакета. В случае работы с DLL написанной на C++ этот вариант не пройдет. Взаимодействовать можно с виртуальными методами класса, написанными на С++, если в приложении на Delphi описать класс с точно таким же набором абстрактных виртуальных методов.


 
iXT   (2004-09-08 23:18) [28]

Не, не поняли (сам виноват)!

1. Под структурой (С) понимаю запись (Делф)
2. Нужно из длл экспортировать не саму запись, а ее "структуру", т.е. описание!!!


 
Mim1 ©   (2004-09-08 23:26) [29]


> [23] IXT   (06.09.04 16:43)
> А структуру экспортировать можно?

[28]
> 1. Под структурой (С) понимаю запись (Делф)


Структура aka record это ведь понятие для компилятора, как вы собираетесь использовать ее в runtime?
Грубо говоря
type
r=record
 a,b:integer;
 s:string
end;

для компилятора озночает что по адресу <base> лежит значение переменной a, по адресу <base>+sizeof(integer) ледит значение переменной b и по адресу <base> + 2 * sizeof(integer) лежит значение переменной s.
Если вы передадите подобное описание в runtime то как вам это пригодится?


 
Григорьев Антон ©   (2004-09-09 09:18) [30]

Небольшой комментарий по поводу того, как в C++ DLL может экспортировать классы.

На самом деле DLL экспортирует только функции, являющиеся методами класса. С этой DLL поставляется заголовочный файл, в котором класс объявлен. Поэтому собственно структура класса из DLL не экспортируется - её там нет. Структура берётся именно из заголовочного файла. Просто при использовании этого заголовочного файла компилятор строит класс таким образом, что реализация его методов берётся из DLL.


 
PVOzerski ©   (2004-09-09 12:24) [31]

IMHO надо брать тот же компилятор Си++ и писать на Си++ враппер - либо c COM-интерфейсом, либо dll с "неклассовыми" функциями-обертками для создания, уничтожения и доступа к объектам.


 
IXT   (2004-09-09 14:19) [32]

To PVOzerski
 То-то и оно!!!



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

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

Наверх




Память: 0.53 MB
Время: 0.031 c
3-1093863664
Aleksandr.
2004-08-30 15:01
2004.09.26
Можно ли как-то в RT бороться с Directory is busy?


1-1095075552
Chizh
2004-09-13 15:39
2004.09.26
Конструкция with...do


14-1094195900
velial
2004-09-03 11:18
2004.09.26
Конвертер исходников Делфи7 в Делфи8


1-1094637479
Jay
2004-09-08 13:57
2004.09.26
TMainMenu


14-1094725175
Ditrix
2004-09-09 14:19
2004.09.26
свободное ПО. конференция в Киеве.





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