powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Класс из динамической Dll
15 сообщений из 15, страница 1 из 1
Класс из динамической Dll
    #33514938
archez
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Приветствую коллеги!

Среда разработки C++ Builder 5.

Такая проблема:
Довел проект до такого момента, когда он начинает терять устойчивость из-за своей грмоздкости и не до конца продуманных взаимосвязей. Отчасти виноват сам, готов признать. Сейчас решил выделить часть кода в отдельную dll-ку и работать с ней как с черным ящиком (на вход "А", на выходе "Б"). Это довольно гроздкий код и используется одновременно в двух исполняемых модулях. Статически включать его в состав одного и другого проектов неэффективно - дублирование большого объема кода. Хорошие решение - динамическая загрузка *.dll. Проблема в том, что этот код предтавляет собой класс (наследует TObject) и его нужно импортировать. Найти информацию о таком трюке мне не удалось. Поэтому не знаю, возможно ли такое вообще.

Почему динамическая линковка, а не статическая:
Импорт тестового класса из статически связанной библиотеки - прошел вполне успешно. Думаю, что и с рабочим сложности не возникнет. Однако в этом случае код будет загружен все время выполнения программы, чего хотелось бы избежать. К тому же из-за того что библиотеку приходится включать в состав проекта, опасаюсь, что если в будущем я захочу использовать ее в среде C++ Builder 6 или вовсе в Visual C, то поимею ряд проблем.

Буду благодарен за любое альтернативное решение.

Заранее благодарен.
С Уважением, Евгений.
...
Рейтинг: 0 / 0
Класс из динамической Dll
    #33514948
Фотография JibSkeart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да можно , классы юзать из динамических ДЛЛ.

допустим воть

http://bdn.borland.com/article/0,1410,20165,00.html
...
Рейтинг: 0 / 0
Класс из динамической Dll
    #33518309
archez
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хмм... Еще не проверил, но вроде должно сработать - спасибо.
...
Рейтинг: 0 / 0
Класс из динамической Dll
    #33519067
kolobok0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
archez...... Найти информацию о таком трюке мне не удалось. Поэтому не знаю, возможно ли такое вообще. ......

а чаво искать то ?
ставите перед классом __declspec(dllexport) в описании дэлеле
и __declspec(dllimport) перед классом в ашнике который поставляете вместе с данной дэлеле...
для автоматизации мона начиркать следующее...
Код: plaintext
1.
2.
3.
4.
5.
#ifdef бла_бла_EXPORTS
#define бла_бла_API __declspec(dllexport)
#else
#define бла_бла_API __declspec(dllimport)
#endif

тогда класс будет выглядеть так (ашник)...

class бла_бла_API xru
{
public:
...........
...........
};

с тэмплейтами обьяву extern в данную комбинацию так же мона записать...

с уважением
(круглый)
...
Рейтинг: 0 / 0
Класс из динамической Dll
    #33519119
_Балтика
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kolobok0
для автоматизации мона начиркать следующее...
Хе-хе. А чего чирикать то. Визард сам это начирикает, если указать постапить галочку рядом с "Export symbols"
...
Рейтинг: 0 / 0
Класс из динамической Dll
    #33519266
kolobok0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_БалтикаХе-хе. А чего чирикать то. Визард сам это начирикает, если указать постапить галочку рядом с "Export symbols"

угумс...
а теперь внимательно читаем ориджинал вопрос... ищем слово идентифицирующий софт мелкомягких...

в студии то я видел..а вот у борланда - ХЗ. посему так и написал..

(круглый)
...
Рейтинг: 0 / 0
Класс из динамической Dll
    #33519478
_Балтика
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kolobok0 _БалтикаХе-хе. А чего чирикать то. Визард сам это начирикает, если указать постапить галочку рядом с "Export symbols"

угумс...
а теперь внимательно читаем ориджинал вопрос... ищем слово идентифицирующий софт мелкомягких...

в студии то я видел..а вот у борланда - ХЗ. посему так и написал..

(круглый)Согласен
...
Рейтинг: 0 / 0
Класс из динамической Dll
    #33520656
archez
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kolobok0 archez...... Найти информацию о таком трюке мне не удалось. Поэтому не знаю, возможно ли такое вообще. ......

а чаво искать то ?
ставите перед классом __declspec(dllexport) в описании дэлеле
и __declspec(dllimport) перед классом в ашнике который поставляете вместе с данной дэлеле...
для автоматизации мона начиркать следующее...
Код: plaintext
1.
2.
3.
4.
5.
#ifdef бла_бла_EXPORTS
#define бла_бла_API __declspec(dllexport)
#else
#define бла_бла_API __declspec(dllimport)
#endif

тогда класс будет выглядеть так (ашник)...

class бла_бла_API xru
{
public:
...........
...........
};

с тэмплейтами обьяву extern в данную комбинацию так же мона записать...

с уважением
(круглый)

Пояните уважаемый, плз, свою мысль.
Дело в том, что согласно http://bdn.borland.com/article/0,1410,20165,00.html
подобный фокус исполняется с родительским классом-интерфейсом, в котором токо виртуальные функции. А по Вашему аналогичный метод можно применить к конечному классу с объявленными методами и свойствами. Я еще не успел проверить сам, но хотелось бы знать подобный код работает или это умозрительное заключение. Если работает, то технология существенно упрощается - не нужно делать класс-интерфейс.
...
Рейтинг: 0 / 0
Класс из динамической Dll
    #33520674
archez
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kolobok0 archez...... Найти информацию о таком трюке мне не удалось. Поэтому не знаю, возможно ли такое вообще. ......

а чаво искать то ?
ставите перед классом __declspec(dllexport) в описании дэлеле
и __declspec(dllimport) перед классом в ашнике который поставляете вместе с данной дэлеле...
для автоматизации мона начиркать следующее...
Код: plaintext
1.
2.
3.
4.
5.
#ifdef бла_бла_EXPORTS
#define бла_бла_API __declspec(dllexport)
#else
#define бла_бла_API __declspec(dllimport)
#endif

тогда класс будет выглядеть так (ашник)...

class бла_бла_API xru
{
public:
...........
...........
};

с тэмплейтами обьяву extern в данную комбинацию так же мона записать...

с уважением
(круглый)

Проверил Вашу технологию - результат:
На этапе компиляции ругается на конструктор и деструктор класса. Если их заремить, то компиляция проходит, но линковщик говорит:
Unresolver external '<function_name>' referenced from mana-mana.obj

Так что видимо, провильная технология именно через класс-интерфейс.
...
Рейтинг: 0 / 0
Класс из динамической Dll
    #33521457
archez
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
JibSkeartДа можно , классы юзать из динамических ДЛЛ.

допустим воть

http://bdn.borland.com/article/0,1410,20165,00.html

Да действительно, не считая пары багов в этом екзампле, методика верная для создания экземпляров класса. А как быть в случае, если в мой класс не подразумевает создания экземпляров, т.е. в нем все методы и свойств - статические.
...
Рейтинг: 0 / 0
Класс из динамической Dll
    #33522823
kolobok0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
archezТак что видимо, провильная технология именно через класс-интерфейс.

Знаете, как говорит один знакомый анжинер...
Неправильные эксперименты ведут к неправильным выводам...

я Вам дал РЕАЛЬНО БОЕВОЙ КОД (заменил только на бла-бла-бла)...

Из постов Выше Вам уже сказали - что данное обьявления классов и(или) переменных генерится АВТОМАТИЧЕСКИ класс визардом в дев.студии под форточками.

а теперь по шагам...
1) в проджэкте Вашей динамически загружаемой дэлеле, находите раздел типа
Preprocessor Definitions
и добавляете туда магическое слово
LIKBEZ
2) в ашнике, который будет поставляться с этой дэлеле (обзовём его "xru.h") пишите следующее...

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
#ifdef LIKBEZ
#define VAU __declspec(dllexport)
#else
#define VAU __declspec(dllimport)
#endif

class VAU xru
{
public:
	xru(void);
	virtual ~xru(void);

	int Start(void);
	void Stop(int& rnId);

	void winter(char* pszLeto);
	char* winter(void);

private:
	char* m_pszBuff;
	int m_nId;
};

в сишнеке пишите следующее

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
#include "xru.h"

xru::xru() : m_pszBuff(NULL), m_nId( 0 )
{
};

xru::~xru()
{
	m_pszBuff = NULL;
};

int xru::Start(void)
{
	return ++m_nId;
};

void xru::Stop(int& rnId)
{
	m_nId = rnId--;
};

void xru::winter(char* pszLeto)
{
	m_pszBuff = pszLeto;	// так делать низзя !
};

char* xru::winter(void)
{
	return m_pszBuff;	// так делать низзя !
};

компилите... убеждаетесь..

в проекте в котором хотите поюзать Вашу дэлеле делаете следующее...
1) у линковщика ищите нечто
Linker->Input->Additional Dependencis
и записываете тудысь нечто следующее...
путя\xru.lib
этот файл возьмите рядом с дэлеле Вашей хрю...оптимально -> нацелить прям путя к выходному каталогу дэлеле.
2) рисуете следующий сишник...
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
#include "xru.h"  // заметьте - тот же самый ашник. его нуна перебросить 
                       //ручками либо указать путя

xru bb;

int m = bb.Start();
m =  8 ;
bb.Stop(m);
bb.winter("spasibo mnogo, trex rubley xvatit");
char* pszIk = bb.winter();

предупреждаю сразу...
всё линкуется и компиляется и работает...

с уважением
(круглый)
...
Рейтинг: 0 / 0
Класс из динамической Dll
    #33522971
kolobok0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
archez....Почему динамическая линковка, а не статическая:
Импорт тестового класса из статически связанной библиотеки - прошел вполне успешно. Думаю, что и с рабочим сложности не возникнет. Однако в этом случае код будет загружен все время выполнения программы, чего хотелось бы избежать......

маленькое замечание...
если Вы хотите управлять загрузкой дэлеле - то придёться делать шаловливыми ручками...
Если Вы хотите динамически грузить на ран-тайме, то это ближе к технологии COM. Подсчёт ссылок, выгрузка из памяти и тд... Механизация COMа хороша тем, что Вы не требуете определённой версии бинарника куска кода, а требуете определённый функционал проассациированный с неким идентификатором. Т.е. имееться возможность безболезненно менять программку "по частям". Правда есть и отрицательные аспекты - напр. версионность.


с уважением
(круглый)
...
Рейтинг: 0 / 0
Класс из динамической Dll
    #33525633
archez
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kolobok0
1) у линковщика ищите нечто
Linker->Input->Additional Dependencis
и записываете тудысь нечто следующее...
путя\xru.lib
этот файл возьмите рядом с дэлеле Вашей хрю...оптимально -> нацелить прям путя к выходному каталогу дэлеле.


Прошу прощения за мой французкий, но либо я действительно чего-то крепко не понимаю либо одно из двух. Ваш метод один в один похож на статическую привязку dll. Главный признак - использование *.lib файла. Динамическое привязывание *.dll использование этого файла не предполагает. Способ динамической привязки подробно изложен в экзампле:
http://bdn.borland.com/article/0,1410,20165,00.html
который любезно предоставил JibSkeart.
Поправьте меня если я ошибаюсь.

C Уважением,
Евгений
...
Рейтинг: 0 / 0
Класс из динамической Dll
    #33525656
archez
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kolobok0 ...Механизация COMа хороша...

Я абсолютно с Вами согласен. Но поскольку делаю первые шаги в области *.dll (раньше вполне обходился *.cpp библиотеками), то счел правильным вначале получше разобраться с этим вопросом, а потом, если увижу что требуемый функционал не достигнут, буду переводить код на COM или CORBA (еще не решил).

С Уважением,
Евгений.
...
Рейтинг: 0 / 0
Класс из динамической Dll
    #33526860
kolobok0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
archez"Ваш метод один в один похож на статическую привязку dll. Главный признак - использование *.lib файла. Динамическое привязывание *.dll использование этого файла не предполагает."

существуют такие понятие как
1) динамическая библиотека
2) статическая библиотека

статика - поставляется в виде бинарного модуля с расширением LIB
динамическая загружаемая библиотека - носит расширение DLL. При компиляции DLL образуется файл связи с расширением LIB. Он служит для упрятывания от Вас в толщу кода, загрузки и привязки вентелей вызовов Вашей DLL.

существуют такие понятия как
1) явная загрузка DLL
2) не явная загрузка DLL

явная - это когда Вы сами грузите ручками DLL.
не явная - отдаёте на откуп механизации, - пример изложен мной выше.

Приношу свои извинения, то что не глянул указанную ссылку ранее. Там описан способ явной загрузки DLL. Если Вам требуется грузить самому - то тут происходить загрузка библиотеки будет в момент явного обращения к апи LoadLibrary(...). Минусы такого метода - на момент загрузки могёт не оказаться исполняемого модуля, и в описании ручками всех используемых точек входа.

Если Вам нужно загружать ручками библиотеку - то тогда рекомендую ышо быстрее ознакомиться с COM технологией (не путать с форточной OLE механизацией)...

с уважением
(круглый)
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Класс из динамической Dll
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]