Форум: "Основная";
Текущий архив: 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