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

Вниз

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

 
Palladin ©   (2002-12-30 20:03) [0]

вот такой прикол
описываем класс в dll
например

uses
ShareMem,
UMyParentClass;
type
TThisClass=class of TMyParentClass;
TMyClass=class(TMyParentClass)
...
//blabla
...
end;

делаем экспортируемую функцию

function GetThisClass:TThisClass;
begin
result:=TMyClass;
end;


а в главное проге подключаем библиотеку и получаем функцию.
и внимание вопрос :)
сработает ли такая вещь?

uses ShareMem,UMyParentClass;
var
myClassObj:TMyParentClass; // описан в этом модуле
begin
myClassObj:=GetThisClassDllFunc.Create;
end;

или это на грани фантастики?


 
Palladin ©   (2002-12-30 20:07) [1]

вещь то я такую сделал
только отдебагить профессионализма не хватает...
ошибка естественно происходит... но не знаю причина в главной проге (ибо приколы творятся) или все таки так делать нельзя...

всех с наступающим! :)


 
Fantasist ©   (2002-12-30 21:48) [2]

Этот вопрос уже проходил несколько раз. Из длл-ки НЕ сработает. Потому, что функция в длл-ке возвращает "указатель на тип класса" который был скомпилирован в dll. По этому указателю, в екзешнике наверняка не лежит описание твоего TThisClass. То есть по сути, TThisClass в длл и TThisClass в ехе - это два разных класса, просто они действуют одинаково.


 
Palladin ©   (2002-12-30 22:16) [3]

хм...
просто подумалось что если exe и dll писались с использованием одинаковых юнитов (то есть описания классов одинаковые) и оба мной и еще принимая во внимание что всетаки подключаемая dll находится с exe в одном адресном пространстве такое прокатило бы...
жаль... было бы интересно...

кстати в поиске я встречал подобные вопросы но в них шла речь о передаче указателя на объект (а не на класс) созданый в dll.
с другой строны странно... с объектами у меня все получалось...
тоесть я прекрасно передавал объект из основной в длл и длл с ними отрабатывала...
но все равно спасибо


 
asmith   (2002-12-30 22:18) [4]

А ты попробуй спросить у этого переданного объекта его тип. Или выполни оператор as.


 
Юрий Зотов ©   (2002-12-30 23:08) [5]

> exe и dll писались с использованием одинаковых юнитов

Да, но КОМПИЛИРОВАЛИСЬ они, как два совершенно самостоятельных проекта, ничего друг о друге не знающих. Поэтому внутренний список классов в каждом из них свой собственный, а то, что в этих двух списках есть классы с одинаковым именем - ничего не значит, это все равно разные классы.


> подключаемая dll находится с exe в одном адресном пространстве

Класс - это по сути указатель. Два разных указателя указывают на два разных адреса в общем адресном пространстве. Обычная вещь.

==========

Но если юнит с Вашим классом поместить в пакет (BPL), а EXE и DLL откомпилировать с этим run-time пакетом, то все будет прекрасно работать. Тогда это действительно будет ОДИН общий класс.



 
Fantasist ©   (2002-12-31 21:11) [6]


> с другой строны странно... с объектами у меня все получалось...
> тоесть я прекрасно передавал объект из основной в длл и
> длл с ними отрабатывала


Не путай "типы" с их "экземплярами". Тип - это только то, что позволяет компилятору знать, какой год генерировать для операции над данными. А экземпляр - это и есть данные. Ехе и длл компилируются отдельно, однако из одинакого исходного текста (т. е. в нашем случае - описание классов) и одниноковых настройках компилятора они сгенерируют одинаковый код, что позволит передавать экземпляры(данные), так как сгенерированный код будет будет проделывать одни и те же операции над этими данными что в ехе что в dll. Однако типы - это совсем не то же самое, типы больше напоминают глобальные переменные в этом смысле - для каждого самостоятельного скомпилированного проекта они уникальны. Если у тебя есть юнит с глобальной переменной, и ты с этим юнитом скомпилировал ехе и длл, то каждый из них имеет эту свою глобальную переменную и о глобольных переменных друг друга, они ничего не знают. Точно так же и с дескрипторами классов.


 
Hun   (2003-01-01 13:03) [7]

Ну да, ДЛЛ и ЕХЕ имеют разные области памяти, поэтому класс, который ты хочешь пользовать надо в экзешнике и создавать. Я когда-то такой штукой баловался, так вот пользовал вот какую штуку (ну что-то типа, сейчас уже все не вспомнить):
type
TDMClass = class of TDataModule;
...
implementation
.....
procedure CreateDocModule(с: TClass);
var dataClassModule : TDataModule;
begin
dataClassModule:=TDataModuleClass(с).Create(nil)
end;

а в ДЛЛ пишешь:
initialization
CreateDocModule(TMyClass);

тогда переменная dataClassModule будет создана в ЕХЕ. Ну здесь она локальна, а можно ее передать куда угодно, пока не удалишь будет жить, только удалять надо обязательно, когда уже этот класс не нужен будет, а то память загадится и вообще плохо будет.
Короче, сам создал - сам удали :)). Только надо, чтобы юнит, где CreateDocModule живет и длл и ехе видели.

А еще можно COM объекты использовать, интерфейс им прописать и вызывай откуда хочешь.

ЗЫ
Вообще-то это работало, но в деталях не помню (может забыл чего), а сейчас по текстам разбираться это долго. Короче идея, надо полагать ясна: создать надо класс там, где его пользуешь.

Удачи.


 
Hun   (2003-01-01 13:07) [8]

Ну конечно еррор вкрался,
вместо
dataClassModule:=TDataModuleClass(с).Create(nil)
надо
dataClassModule:=TDMClass(с).Create(nil)



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

Текущий архив: 2003.01.13;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.014 c
4-37454
rhf
2002-11-24 19:14
2003.01.13
Popup меню из ресурса


6-37238
Mr. Moon
2002-11-12 14:57
2003.01.13
Сообщение по новелу


14-37370
woffs
2002-12-25 12:00
2003.01.13
Шаблоны, парсеры


1-37080
freeek
2003-01-03 10:36
2003.01.13
строки


4-37436
AlexandrRya
2002-11-09 11:41
2003.01.13
TabbedTextOut