Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.09.05;
Скачать: CL | DM;

Вниз

Классы через 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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.015 c
3-13887
Пушкин
2002-08-14 11:03
2002.09.05
Я ненавижу StoredProc!


1-14085
EugenCFG
2002-08-18 11:07
2002.09.05
Стандартная функция копирования Ctrl+C...


1-14002
EugenCFG
2002-08-26 09:18
2002.09.05
Есть ToolButton style tbsDropDown...


14-14225
AL2002
2002-08-09 12:55
2002.09.05
Тут ветка для хакеров была


1-14038
Jah
2002-08-26 16:53
2002.09.05
Graphic