![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Классы в DLL [D6, WinXP]
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 ?