Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Классы через Dll


Lendl ©   (2002-08-23 12:23:00) 

Подскажите п-та, как правильно передавать классы через Dll.
(Пример на С++)
Объявляю и определяю класс в библиотеке MyDll.dll так:

#define MYDLLA_EXPORT __declspec(dllexport)
class MYDLLA_EXPORT MyClass
{
...
};

Требуется вызвать класс MyClass, используя динамическую загрузку MyDll. Как это сделать?


murza   (2002-08-26 13:24:00) [1]


> Lendl (26.08.02 13:10)
> У меня тоже. Если не затруднит - директом. Спасибо.

Лови письмо. ВТОРОЕ (в первое забыл вложить).


Игорь Шевченко   (2002-08-26 13:14:00) [2]

Lendl (26.08.02 13:10)

Еще раз:

http://www.delphikingdom.com/mastering/plugins.htm


Lendl   (2002-08-26 13:10:00) [3]


> могу дать примерчик.
> ЗЫ у меня BCB5

У меня тоже. Если не затруднит - директом. Спасибо.


murza   (2002-08-26 12:22:00) [4]


> Lendl (26.08.02 12:02)
> где можно почитать про то как импортировать
> классы через BPL? Желательно с примерами. Спасибо.

Ладно открою карты, мне это тоже интересно
http://delphi.mastak.ru/cgi-bin/forum.pl?look=1&id=1030004779&n=0
Мне даже подсказали как получить список экспортируемых классов
http://rsdn.ru/forum/message.asp?mid=88501
Но за неимением времени (надо работу заканчивать http://delphi.mastak.ru/cgi-bin/forum.pl?look=1&id=1030348200&n=0и http://delphi.mastak.ru/cgi-bin/forum.pl?look=1&id=1030350105&n=0) не могу приступить к разработке.
Вообще я делал примерно следущее: регистрил все известные мне классы вручную, а потом загружал форму из DFM. Правда сначала "обработав" ее - очистив обработчики событий. Хотя к теме вопроса это мало относится, могу дать примерчик.
ЗЫ у меня BCB5


Lendl   (2002-08-26 12:02:00) [5]


> ...разве что хочешь сделать маленький и удобный билдер - в
> смысле обеспечить возможность создания и получение интерфейсов
> компонентов...

Ваша правда г-н > murza, вот только народ в конференции интересуется где можно почитать про то как импортировать классы через BPL? Желательно с примерами. Спасибо.


Игорь Шевченко   (2002-08-26 11:48:00) [6]

Yaro © (23.08.02 22:38)

http://www.delphikingdom.com/mastering/plugins.htm


murza   (2002-08-26 11:10:00) [7]


> Lendl (23.08.02 15:48)
> То, что предложил г-н >murzaэто ни что иное, как создание
> экземпляров класса через экспорт функции CreateInstance()
> , а не класса, все-таки. Разница есть, согласитесь?

Именно это я и предложил. Но как ты представляешь себе экпорт класса? Во время работы программа подгрузит DLL, найдет новый класс, изучит его хорошенько, узнает какие у него поля и методы, (да проперти еще). И после этого таинственным образом их будет вызывать. Так или иначе это подразумевает использование RTTI и билдеровской библиотеки классов. Самое очевидное решение - использование соответствующих средств, а именно BPL для импорта класса, да еще DFM может разве что для удобства.
Единственный альтернативный способ не повторять достижения RTTI и добиться результата - использование иерархии классов. То что я описал. Если конечно тебе это подходит.

Я не совсем понимаю для каких целей понадобилось импортирование классов. Если клиент хочет получать в некотором роде схожие объекты (например - скины, математические функции, NPC для игрушки), то здесь подходит наследование. Правда есть одно но, с которым придется смириться - об импортируемом классе ничего нельзя будет узнать.
Если же ты сам не знаешь, с чем тебе придется работать (вот это я слабо представляю, разве что хочешь сделать маленький и удобный билдер - в смысле обеспечить возможность создания и получение интерфейсов компонентов) тогда тебе подойдут стандартные средства.


Yaro   (2002-08-23 22:38:00) [8]

Расскажите как работать с Package"ами в Run-Time на примере или дайте ссылку где искать. Заранее спасибо! (этот вопрос меня мучает не первый день, просто.


vuk   (2002-08-23 16:47:00) [9]

Нужна универсальность (более или менее) - используйте COM.


Lendl   (2002-08-23 16:43:00) [10]

Полностью согласен, но bpl это Borland-овская фишка, а как быть с библиотеками, созданными в VC и т.п. Здесь задачу необходимо решать ВыньДОСовскими средствами, чтобы не потерять универсальности в использовании прогарммы.


Игорь Шевченко   (2002-08-23 16:03:00) [11]

Попробуйте использовать пакеты - прекрасно загружаются динамически функцией LoadPackage. Почти те же DLL


Lendl   (2002-08-23 15:48:00) [12]

Спасибо ВСЕМ за помощь.
Я думал и думаю, что есть какой-то хитрый, неописанный в доке, механизм экспорта классов(объектов).
То, что предложил г-н >murzaэто ни что иное, как создание экземпляров класса через экспорт функции CreateInstance(), а не класса, все-таки. Разница есть, согласитесь?
Напомню, что речь идет о динамической загрузке библиотеки. Со статической загрузкой все работает как по книжке.
Вопрос остается открытым и неясным...


Игорь Шевченко   (2002-08-23 14:41:00) [13]

murza (23.08.02 14:17)

Delphi от C++ несколько отличается...В частности, отсутсвием экспорта классов из DLL...


Zelius   (2002-08-23 14:38:00) [14]

помоему, murza дал описание создания ручками интерфейсов в Дельфи... то есть изобрел велосипед :)


murza   (2002-08-23 14:17:00) [15]

не пишу на дельфях. А что надо? Классы (или как их там, объекты?) объявить каждый сможет. Я описал схему наследования. Фраза Пишешь экспортируемую функцию, которая создает экземпляр TDerivedClass и возвращает указатель на него как TBaseClassя думаю и дельфисту понятна будет, а синтаксис в хелпах описан.
По поводу "динамической подрубки":
В билдере я делаю:
handle = LoadLibrary("LibraryName.dll");
MyFunctionType *MyFunctionPointer;
MyFunctionPointer = GetProcAddress(handle,"MyFunctionName");

и в конце
FreeLibrary(handle);
Функции API-шные, то есть в дельфях они тоже есть. И справка по ним есть.


Yaro   (2002-08-23 13:42:00) [16]

murza -> повтори еще раз тоже самое на делифи (описание), желатьельно с динамической подрубкой ДЛЛ


murza   (2002-08-23 12:37:00) [17]

Можно и по другому:
Объявляешь в общем для программы и DLL класс TBaseClass( с виртуальными функциями).
Пишешь DLL, в ней наследуешь новый класс class TDerivedClass: public TBaseClass, перегружаешь виртуальные методы. Пишешь экспортируемую функцию, которая создает экземпляр TDerivedClass и возвращает указатель на него как TBaseClass. То есть:
extern "C" TBaseClass * DLL_EI CreateInstance() {...}В приложении загружаешь библиотеку, импортируешь функцию, создаешь экземпляры. Они работают правильно за счет виртуальных методов. Наслаждаешься.


Игорь Шевченко   (2002-08-23 12:30:00) [18]

Для Delphi - использовать BPL (Packages). Это единственный гарантировано нормальный способ экспортировать классы


Наверх

Титульная страница Поиск, карта сайта Написать письмо