Форум: "Основная";
Текущий архив: 2002.09.05;
Скачать: [xml.tar.bz2];
ВнизКлассы через Dll Найти похожие ветки
← →
Lendl (2002-08-23 12:23) [0]Подскажите п-та, как правильно передавать классы через Dll.
(Пример на С++)
Объявляю и определяю класс в библиотеке MyDll.dll так:
#define MYDLLA_EXPORT __declspec(dllexport)
class MYDLLA_EXPORT MyClass
{
...
};
Требуется вызвать класс MyClass, используя динамическую загрузку MyDll. Как это сделать?
← →
Игорь Шевченко (2002-08-23 12:30) [1]Для Delphi - использовать BPL (Packages). Это единственный гарантировано нормальный способ экспортировать классы
← →
murza (2002-08-23 12:37) [2]Можно и по другому:
Объявляешь в общем для программы и DLL классTBaseClass
( с виртуальными функциями).
Пишешь DLL, в ней наследуешь новый классclass TDerivedClass: public TBaseClass
, перегружаешь виртуальные методы. Пишешь экспортируемую функцию, которая создает экземпляр TDerivedClass и возвращает указатель на него как TBaseClass. То есть:
extern "C" TBaseClass * DLL_EI CreateInstance() {...}
В приложении загружаешь библиотеку, импортируешь функцию, создаешь экземпляры. Они работают правильно за счет виртуальных методов. Наслаждаешься.
← →
Yaro (2002-08-23 13:42) [3]murza -> повтори еще раз тоже самое на делифи (описание), желатьельно с динамической подрубкой ДЛЛ
← →
murza (2002-08-23 14:17) [4]не пишу на дельфях. А что надо? Классы (или как их там, объекты?) объявить каждый сможет. Я описал схему наследования. Фраза Пишешь экспортируемую функцию, которая создает экземпляр TDerivedClass и возвращает указатель на него как TBaseClass я думаю и дельфисту понятна будет, а синтаксис в хелпах описан.
По поводу "динамической подрубки":
В билдере я делаю:
handle = LoadLibrary("LibraryName.dll");
MyFunctionType *MyFunctionPointer;
MyFunctionPointer = GetProcAddress(handle,"MyFunctionName");
и в конце
FreeLibrary(handle);
Функции API-шные, то есть в дельфях они тоже есть. И справка по ним есть.
← →
Zelius (2002-08-23 14:38) [5]помоему, murza дал описание создания ручками интерфейсов в Дельфи... то есть изобрел велосипед :)
← →
Игорь Шевченко (2002-08-23 14:41) [6]murza (23.08.02 14:17)
Delphi от C++ несколько отличается...В частности, отсутсвием экспорта классов из DLL...
← →
Lendl (2002-08-23 15:48) [7]Спасибо ВСЕМ за помощь.
Я думал и думаю, что есть какой-то хитрый, неописанный в доке, механизм экспорта классов(объектов).
То, что предложил г-н >murzaэто ни что иное, как создание экземпляров класса через экспорт функции CreateInstance() , а не класса, все-таки. Разница есть, согласитесь?
Напомню, что речь идет о динамической загрузке библиотеки. Со статической загрузкой все работает как по книжке.
Вопрос остается открытым и неясным...
← →
Игорь Шевченко (2002-08-23 16:03) [8]Попробуйте использовать пакеты - прекрасно загружаются динамически функцией LoadPackage. Почти те же DLL
← →
Lendl (2002-08-23 16:43) [9]Полностью согласен, но bpl это Borland-овская фишка, а как быть с библиотеками, созданными в VC и т.п. Здесь задачу необходимо решать ВыньДОСовскими средствами, чтобы не потерять универсальности в использовании прогарммы.
← →
vuk (2002-08-23 16:47) [10]Нужна универсальность (более или менее) - используйте COM.
← →
Yaro (2002-08-23 22:38) [11]Расскажите как работать с Package"ами в Run-Time на примере или дайте ссылку где искать. Заранее спасибо! (этот вопрос меня мучает не первый день, просто.
← →
murza (2002-08-26 11:10) [12]
> Lendl (23.08.02 15:48)
> То, что предложил г-н >murzaэто ни что иное, как создание
> экземпляров класса через экспорт функции CreateInstance()
> , а не класса, все-таки. Разница есть, согласитесь?
Именно это я и предложил. Но как ты представляешь себе экпорт класса? Во время работы программа подгрузит DLL, найдет новый класс, изучит его хорошенько, узнает какие у него поля и методы, (да проперти еще). И после этого таинственным образом их будет вызывать. Так или иначе это подразумевает использование RTTI и билдеровской библиотеки классов. Самое очевидное решение - использование соответствующих средств, а именно BPL для импорта класса, да еще DFM может разве что для удобства.
Единственный альтернативный способ не повторять достижения RTTI и добиться результата - использование иерархии классов. То что я описал. Если конечно тебе это подходит.
Я не совсем понимаю для каких целей понадобилось импортирование классов. Если клиент хочет получать в некотором роде схожие объекты (например - скины, математические функции, NPC для игрушки), то здесь подходит наследование. Правда есть одно но, с которым придется смириться - об импортируемом классе ничего нельзя будет узнать.
Если же ты сам не знаешь, с чем тебе придется работать (вот это я слабо представляю, разве что хочешь сделать маленький и удобный билдер - в смысле обеспечить возможность создания и получение интерфейсов компонентов) тогда тебе подойдут стандартные средства.
← →
Игорь Шевченко (2002-08-26 11:48) [13]Yaro © (23.08.02 22:38)
http://www.delphikingdom.com/mastering/plugins.htm
← →
Lendl (2002-08-26 12:02) [14]
> ...разве что хочешь сделать маленький и удобный билдер - в
> смысле обеспечить возможность создания и получение интерфейсов
> компонентов...
Ваша правда г-н > murza, вот только народ в конференции интересуется где можно почитать про то как импортировать классы через BPL? Желательно с примерами. Спасибо.
← →
murza (2002-08-26 12:22) [15]
> 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 13:10) [16]
> могу дать примерчик.
> ЗЫ у меня BCB5
У меня тоже. Если не затруднит - директом. Спасибо.
← →
Игорь Шевченко (2002-08-26 13:14) [17]Lendl (26.08.02 13:10)
Еще раз:
http://www.delphikingdom.com/mastering/plugins.htm
← →
murza (2002-08-26 13:24) [18]
> Lendl (26.08.02 13:10)
> У меня тоже. Если не затруднит - директом. Спасибо.
Лови письмо. ВТОРОЕ (в первое забыл вложить).
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.09.05;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.008 c