![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Классы через 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). Это единственный гарантировано нормальный способ экспортировать классы