Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.09.26;
Скачать: CL | DM;

Вниз

Классы в 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;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.042 c
8-1088615053
Delphistik
2004-06-30 21:04
2004.09.26
Слежка за Image...


1-1094972135
Navi
2004-09-12 10:55
2004.09.26
Владелец коллекции


1-1094803567
DesWind
2004-09-10 12:06
2004.09.26
Изменение состояня окна


1-1094921344
Navi
2004-09-11 20:49
2004.09.26
Delphi под админом и юзером


14-1094475422
lipskiy
2004-09-06 16:57
2004.09.26
Хотелось бы узнать прочность защиты данных. Взломайте?