Форум: "Основная";
Текущий архив: 2003.01.13;
Скачать: [xml.tar.bz2];
ВнизКлассы в длл Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.008 c