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

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

Классы в DLL [D6, WinXP]


Страницы:   1 2

Beer ©   (2004-09-06 12:45:00) 

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

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

 С уважением


IXT   (2004-09-09 14:19:00) [1]

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


PVOzerski   (2004-09-09 12:24:00) [2]

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


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

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

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


Mim1   (2004-09-08 23:26:00) [4]


> [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 то как вам это пригодится?


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

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

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


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

GuAV ©   (06.09.04 23:04) [26]


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


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


GuAV   (2004-09-06 23:04:00) [7]

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


> > Я понимаю под этим экспортируемую функцию,
>возвращающую
>> потомка 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;совместимы с точки зрения способа передачи параметров.


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

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

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

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

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


Reindeer Moss Eater   (2004-09-06 16:45:00) [9]

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


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

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


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


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


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


Reindeer Moss Eater   (2004-09-06 16:13:00) [12]

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

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

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


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


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


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


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


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


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


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


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


Reindeer Moss Eater   (2004-09-06 16:02:00) [15]

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


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

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


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


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


Reindeer Moss Eater   (2004-09-06 15:51:00) [17]

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

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


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

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


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


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

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


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


Именно.


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


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


Reindeer Moss Eater   (2004-09-06 15:35:00) [19]

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


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


Reindeer Moss Eater   (2004-09-06 15:24:00) [20]

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

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


Страницы:   1 2

Наверх

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