Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2003.08.11;
Скачать: [xml.tar.bz2];

Вниз

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

 
SkyRanger   (2003-07-29 02:32) [0]

Читаю книжку... Умную.. :) Использование Delphi 3, 1997 года, Диалектика, Киев-Москва.
Глава 26 Программирование DLL : Сложный материал

Написанно:

... Класс скомпилированный в DLL проект остается недоступным модулю EXE, загрузившему DLL. Поэтому необходимо применять обычные функции...

И тама есть такой пример

function INIT(...) : TClass..
Воззвращаемое значение - экземпляр класса!

Вопрос такой - как я это значение и где должен хранить при импорте этой функции из DLL???


 
Юрий Зотов   (2003-07-29 04:31) [1]

> Воззвращаемое значение - экземпляр класса!

Вероятно, все же сам класс, а не его экземпляр (иначе было бы TObject). Хранить его можно в переменной типа TClass:

var
A: TClass;
begin
A := Init(...);


 
Suntechnic   (2003-07-29 04:35) [2]

как я это значение и где должен хранить при импорте этой функции из DLL???

Ни как и ни где. Терзают меня смутные сомнения, что в этой книжке данная ф-ция экспортируется из DLL. Впрочем, если это и так, то значит там глупость написана.

Если интересует экспорт классов из модулей, читаем литературу по BPL.


 
Юрий Зотов   (2003-07-29 04:57) [3]

> Suntechnic © (29.07.03 04:35)

Не факт. IMHO, для таких выводов информации слишком мало, поскольку неизвестны параметры и тело функции. Вот пример, который сработает и в DLL:

function Init(Obj: TObject): TClass;
begin
Result := Obj.ClassType
end;


 
Suntechnic   (2003-07-29 05:14) [4]

>Юрий Зотов ©
Для каких выводов мало информации? Для тех что экспорт классов это опасная тропинка, по которой лучше не гулять? Можно не только TClass вернуть. Можно, практически, всё что угодно вернуть без видимых проблем до поры до времени, но... не мне же Вам рассказывать, что произойдёт, если поменяется определение класса. Поэтому я не думаю, что в серьёзной литературе кто то будет рекомендовать работать с классами в DLL без, как минимум, объяснения последствий.


 
Юрий Зотов   (2003-07-29 05:41) [5]

> Suntechnic © (29.07.03 05:14)

1. Функция, возвращающая классовую ссылку - это еще не экспорт классов (см. пример выше). В вопросе нет информации, позволяющей в данном случае говорить об экспорте класса из DLL, поэтому и делать такой вывод преждевременно.

2. Книга учебная и в каком контексте там приведен этот пример - неизвестно. Возможно, как раз в негативном - как пример того, чего не следует делать. Поэтому и делать выводы о книге тоже преждевременно.


 
Suntechnic   (2003-07-29 05:52) [6]

>Юрий Зотов ©
Функция, возвращающая классовую ссылку - это еще не экспорт классов


А что Вы дальше собираетесь делать с этой ссылкой? Вернуть её просто так в учебных целях?

Возможно, как раз в негативном - как пример того, чего не следует делать.

С этим трудно спорить, поэтому я и выразил сомнения по этому поводу в самом первом своём посте.


 
Юрий Зотов   (2003-07-29 06:02) [7]

> Suntechnic © (29.07.03 05:52)
> А что Вы дальше собираетесь делать с этой ссылкой?

Все, что вообще можно делать с классовой ссылкой. Например, создать экземпляр этого класса. Или получить список его свойств и методов. Или еще что-то.


 
Suntechnic   (2003-07-29 06:20) [8]

>Юрий Зотов ©
Все, что вообще можно делать с классовой ссылкой. Например, создать экземпляр этого класса. Или получить список его свойств и методов. Или еще что-то.


Вот и я о том же. Как только мы произведём хоть одно действие из вышеописанных Вами, мы тот час же займёмся экспортом классов, как бы нам этого не хотелось.


 
Юрий Зотов   (2003-07-29 06:45) [9]

> Suntechnic © (29.07.03 06:20)

Вынужден повторить: функция, возвращающая классовую ссылку - это еще не экспорт классов.

Пример я Вам привел. Ссылка будет возвращена из DLL, но в контексте Exe. Никакого экспорта. И делать с такой ссылкой в Exe можно все, что вообще можно делать с классами.

Вообще, как Вы понимаете термин "экспорт класса из DLL"? Если просто как передачу в Exe ссылки на любой класс или объект, то Вы заблуждаетесь.


 
Suntechnic   (2003-07-29 07:31) [10]

>Юрий Зотов ©
Вообще это всё перерастает уже во флейм. Не знаю как Вы, но я ограничусь пожалуй этим постом.

функция, возвращающая классовую ссылку - это еще не экспорт классов.

Используя эту ссылку Вы собирались создавать объект класса описанного где? В DLL? А получать список свойств и методов какого класса? Определённого где, в DLL? Только вот связи между типами, описанными в DLL, и используеммыми в exe не существует ровным счётом никакой. Будьте тогда уж последовательны в своём примере и опишите реально работающий и имеющий смысл(!) (потому как просто возврат TClass смысла особого не несёт) механизм использования классовой ссылки, возвращённой из DLL. Ну а затем уже можно и обсудить термин "экспорт класса из DLL" и кто чего под этим понимает... впрочем я кажется собирался на этом флейм закончить :)


 
Юрий Зотов   (2003-07-29 10:27) [11]

> Suntechnic © (29.07.03 07:31)

> Используя эту ссылку Вы собирались создавать объект класса
> описанного где? В DLL?

В Exe или в совместно используемом BPL, естественно. И никакого экспорта. Потому что функция, возвращающая классовую ссылку - это еще не экспорт классов.


> связи между типами, описанными в DLL, и используеммыми в exe
> не существует ровным счётом никакой

Знаете, Вы только не удивляйтесь, но эту же фразу на этом же форуме я повторял далеко не раз.

===============================

Реальный пример желаете? Нет проблем. Из кода своего Exe вызываю функцию DLL, написанную моим клиентом-AСУшником (естественно, по составленной мною документации). Эта функция проверяет какие-то принятые на данном предприятии бизнес-правила (мне даже неизвестные) и в зависимости от результата возвращает ссылку на тот или иной класс из BPL (написанный мною же). Далее создаю экземпляр этого класса и остальную работу в данном куске кода делает уже он.

Таким образом, не зная никаких конкретных бизнес-правил, я охватываю свое программой массу их возможных вариантов. И максимально упрощаю задачу АСУшника.

И на этом флейм действительно можно закончить. А еще лучше было бы его и не начинать. Потому что в вопросе НЕТ НИКАКОЙ ИНФОРМАЦИИ, ПОЗВОЛЯЮЩЕЙ УТВЕРЖДАТЬ, ЧТО РЕЧЬ В НЕМ ИДЕТ ИМЕННО ОБ ЭКСПОРТЕ КЛАССОВ. Это факт, с которым надо было просто согласиться, без всяких флеймов.


 
panov   (2003-07-29 11:33) [12]

Ну, флейм не флейм, а вопрос интересный не только для двоих человек, я думаю-)


 
vuk   (2003-07-29 13:05) [13]

Если уж на то пошло, то лично я бы из DLL (не BPL) возвращал не классы и не ссылки на них, а ссылки на интерфейсы.



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

Форум: "Основная";
Текущий архив: 2003.08.11;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.006 c
1-33155
MSTX
2003-07-26 15:32
2003.08.11
Как сделать чтобы слева в RichEdit отображались номера строк...


3-33046
victor_ch
2003-07-15 09:29
2003.08.11
Вызов хранимой процедуры в запросе


14-33288
GSV_
2003-07-23 13:25
2003.08.11
ISAPi. Клиенты работают в одном потоке. Опять грабли.


1-33166
KSergey
2003-07-28 14:27
2003.08.11
По поводу TInplaceEdit в TCustomGrid


1-33103
Zheks
2003-07-29 16:55
2003.08.11
Округление





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский