Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
14-14242
Razpizdyi
2002-08-10 07:59
2002.09.05
Смена иконок


1-14097
Nikoss
2002-08-23 15:13
2002.09.05
как разорвать связь файловой переменной с файлом?


8-14188
Чокнутый
2002-04-29 15:22
2002.09.05
Графика в Delphi


3-13954
atikiN
2002-08-12 15:11
2002.09.05
Графика и музыка в БД


3-13878
Slaviq
2002-08-16 15:52
2002.09.05
Query





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