Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
3-36996
Влад2
2002-12-18 13:01
2003.01.13
Сбой реструктуризации при попытке открытия таблицы


1-37042
Шоломицкий
2003-01-02 17:10
2003.01.13
Вот на C++ не понимаю нифига! Пожалуйста помогите!


1-37083
alvin
2003-01-03 10:24
2003.01.13
TreeView


3-36959
std79
2002-12-18 13:52
2003.01.13
Значения для столбца из БД


14-37346
deniall
2002-12-24 16:42
2003.01.13
Срочно!!!





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский