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

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

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

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

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

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

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

http://bdn.borland.com/article/0,1410,20165,00.html
...
Рейтинг: 0 / 0
02.02.2006, 11:15
    #33518309
archez
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Класс из динамической Dll
Хмм... Еще не проверил, но вроде должно сработать - спасибо.
...
Рейтинг: 0 / 0
02.02.2006, 14:30
    #33519067
kolobok0
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Класс из динамической Dll
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
02.02.2006, 14:41
    #33519119
_Балтика
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Класс из динамической Dll
kolobok0
для автоматизации мона начиркать следующее...
Хе-хе. А чего чирикать то. Визард сам это начирикает, если указать постапить галочку рядом с "Export symbols"
...
Рейтинг: 0 / 0
02.02.2006, 15:11
    #33519266
kolobok0
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Класс из динамической Dll
_БалтикаХе-хе. А чего чирикать то. Визард сам это начирикает, если указать постапить галочку рядом с "Export symbols"

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

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

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

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

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

(круглый)Согласен
...
Рейтинг: 0 / 0
03.02.2006, 03:21
    #33520656
archez
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Класс из динамической Dll
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
03.02.2006, 04:36
    #33520674
archez
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Класс из динамической Dll
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
03.02.2006, 11:50
    #33521457
archez
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Класс из динамической Dll
JibSkeartДа можно , классы юзать из динамических ДЛЛ.

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

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

Да действительно, не считая пары багов в этом екзампле, методика верная для создания экземпляров класса. А как быть в случае, если в мой класс не подразумевает создания экземпляров, т.е. в нем все методы и свойств - статические.
...
Рейтинг: 0 / 0
03.02.2006, 17:25
    #33522823
kolobok0
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Класс из динамической Dll
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
03.02.2006, 18:25
    #33522971
kolobok0
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Класс из динамической Dll
archez....Почему динамическая линковка, а не статическая:
Импорт тестового класса из статически связанной библиотеки - прошел вполне успешно. Думаю, что и с рабочим сложности не возникнет. Однако в этом случае код будет загружен все время выполнения программы, чего хотелось бы избежать......

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


с уважением
(круглый)
...
Рейтинг: 0 / 0
06.02.2006, 12:50
    #33525633
archez
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Класс из динамической Dll
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
06.02.2006, 12:57
    #33525656
archez
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Класс из динамической Dll
kolobok0 ...Механизация COMа хороша...

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

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

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

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

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

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

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

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

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


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