
Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
|
01.02.2006, 08:37
|
|||
|---|---|---|---|
|
|||
Класс из динамической Dll |
|||
|
#18+
Приветствую коллеги! Среда разработки C++ Builder 5. Такая проблема: Довел проект до такого момента, когда он начинает терять устойчивость из-за своей грмоздкости и не до конца продуманных взаимосвязей. Отчасти виноват сам, готов признать. Сейчас решил выделить часть кода в отдельную dll-ку и работать с ней как с черным ящиком (на вход "А", на выходе "Б"). Это довольно гроздкий код и используется одновременно в двух исполняемых модулях. Статически включать его в состав одного и другого проектов неэффективно - дублирование большого объема кода. Хорошие решение - динамическая загрузка *.dll. Проблема в том, что этот код предтавляет собой класс (наследует TObject) и его нужно импортировать. Найти информацию о таком трюке мне не удалось. Поэтому не знаю, возможно ли такое вообще. Почему динамическая линковка, а не статическая: Импорт тестового класса из статически связанной библиотеки - прошел вполне успешно. Думаю, что и с рабочим сложности не возникнет. Однако в этом случае код будет загружен все время выполнения программы, чего хотелось бы избежать. К тому же из-за того что библиотеку приходится включать в состав проекта, опасаюсь, что если в будущем я захочу использовать ее в среде C++ Builder 6 или вовсе в Visual C, то поимею ряд проблем. Буду благодарен за любое альтернативное решение. Заранее благодарен. С Уважением, Евгений. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
01.02.2006, 08:47
|
|||
|---|---|---|---|
Класс из динамической Dll |
|||
|
#18+
Да можно , классы юзать из динамических ДЛЛ. допустим воть http://bdn.borland.com/article/0,1410,20165,00.html ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
02.02.2006, 11:15
|
|||
|---|---|---|---|
|
|||
Класс из динамической Dll |
|||
|
#18+
Хмм... Еще не проверил, но вроде должно сработать - спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
02.02.2006, 14:30
|
|||
|---|---|---|---|
Класс из динамической Dll |
|||
|
#18+
archez...... Найти информацию о таком трюке мне не удалось. Поэтому не знаю, возможно ли такое вообще. ...... а чаво искать то ? ставите перед классом __declspec(dllexport) в описании дэлеле и __declspec(dllimport) перед классом в ашнике который поставляете вместе с данной дэлеле... для автоматизации мона начиркать следующее... Код: plaintext 1. 2. 3. 4. 5. тогда класс будет выглядеть так (ашник)... class бла_бла_API xru { public: ........... ........... }; с тэмплейтами обьяву extern в данную комбинацию так же мона записать... с уважением (круглый) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
02.02.2006, 14:41
|
|||
|---|---|---|---|
|
|||
Класс из динамической Dll |
|||
|
#18+
kolobok0 для автоматизации мона начиркать следующее... Хе-хе. А чего чирикать то. Визард сам это начирикает, если указать постапить галочку рядом с "Export symbols" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
02.02.2006, 15:11
|
|||
|---|---|---|---|
Класс из динамической Dll |
|||
|
#18+
_БалтикаХе-хе. А чего чирикать то. Визард сам это начирикает, если указать постапить галочку рядом с "Export symbols" угумс... а теперь внимательно читаем ориджинал вопрос... ищем слово идентифицирующий софт мелкомягких... в студии то я видел..а вот у борланда - ХЗ. посему так и написал.. (круглый) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
02.02.2006, 15:59
|
|||
|---|---|---|---|
|
|||
Класс из динамической Dll |
|||
|
#18+
kolobok0 _БалтикаХе-хе. А чего чирикать то. Визард сам это начирикает, если указать постапить галочку рядом с "Export symbols" угумс... а теперь внимательно читаем ориджинал вопрос... ищем слово идентифицирующий софт мелкомягких... в студии то я видел..а вот у борланда - ХЗ. посему так и написал.. (круглый)Согласен ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
03.02.2006, 03:21
|
|||
|---|---|---|---|
|
|||
Класс из динамической Dll |
|||
|
#18+
kolobok0 archez...... Найти информацию о таком трюке мне не удалось. Поэтому не знаю, возможно ли такое вообще. ...... а чаво искать то ? ставите перед классом __declspec(dllexport) в описании дэлеле и __declspec(dllimport) перед классом в ашнике который поставляете вместе с данной дэлеле... для автоматизации мона начиркать следующее... Код: plaintext 1. 2. 3. 4. 5. тогда класс будет выглядеть так (ашник)... class бла_бла_API xru { public: ........... ........... }; с тэмплейтами обьяву extern в данную комбинацию так же мона записать... с уважением (круглый) Пояните уважаемый, плз, свою мысль. Дело в том, что согласно http://bdn.borland.com/article/0,1410,20165,00.html подобный фокус исполняется с родительским классом-интерфейсом, в котором токо виртуальные функции. А по Вашему аналогичный метод можно применить к конечному классу с объявленными методами и свойствами. Я еще не успел проверить сам, но хотелось бы знать подобный код работает или это умозрительное заключение. Если работает, то технология существенно упрощается - не нужно делать класс-интерфейс. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
03.02.2006, 04:36
|
|||
|---|---|---|---|
|
|||
Класс из динамической Dll |
|||
|
#18+
kolobok0 archez...... Найти информацию о таком трюке мне не удалось. Поэтому не знаю, возможно ли такое вообще. ...... а чаво искать то ? ставите перед классом __declspec(dllexport) в описании дэлеле и __declspec(dllimport) перед классом в ашнике который поставляете вместе с данной дэлеле... для автоматизации мона начиркать следующее... Код: plaintext 1. 2. 3. 4. 5. тогда класс будет выглядеть так (ашник)... class бла_бла_API xru { public: ........... ........... }; с тэмплейтами обьяву extern в данную комбинацию так же мона записать... с уважением (круглый) Проверил Вашу технологию - результат: На этапе компиляции ругается на конструктор и деструктор класса. Если их заремить, то компиляция проходит, но линковщик говорит: Unresolver external '<function_name>' referenced from mana-mana.obj Так что видимо, провильная технология именно через класс-интерфейс. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
03.02.2006, 11:50
|
|||
|---|---|---|---|
|
|||
Класс из динамической Dll |
|||
|
#18+
JibSkeartДа можно , классы юзать из динамических ДЛЛ. допустим воть http://bdn.borland.com/article/0,1410,20165,00.html Да действительно, не считая пары багов в этом екзампле, методика верная для создания экземпляров класса. А как быть в случае, если в мой класс не подразумевает создания экземпляров, т.е. в нем все методы и свойств - статические. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
03.02.2006, 17:25
|
|||
|---|---|---|---|
Класс из динамической Dll |
|||
|
#18+
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. в сишнеке пишите следующее Код: 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. компилите... убеждаетесь.. в проекте в котором хотите поюзать Вашу дэлеле делаете следующее... 1) у линковщика ищите нечто Linker->Input->Additional Dependencis и записываете тудысь нечто следующее... путя\xru.lib этот файл возьмите рядом с дэлеле Вашей хрю...оптимально -> нацелить прям путя к выходному каталогу дэлеле. 2) рисуете следующий сишник... Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. предупреждаю сразу... всё линкуется и компиляется и работает... с уважением (круглый) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
03.02.2006, 18:25
|
|||
|---|---|---|---|
Класс из динамической Dll |
|||
|
#18+
archez....Почему динамическая линковка, а не статическая: Импорт тестового класса из статически связанной библиотеки - прошел вполне успешно. Думаю, что и с рабочим сложности не возникнет. Однако в этом случае код будет загружен все время выполнения программы, чего хотелось бы избежать...... маленькое замечание... если Вы хотите управлять загрузкой дэлеле - то придёться делать шаловливыми ручками... Если Вы хотите динамически грузить на ран-тайме, то это ближе к технологии COM. Подсчёт ссылок, выгрузка из памяти и тд... Механизация COMа хороша тем, что Вы не требуете определённой версии бинарника куска кода, а требуете определённый функционал проассациированный с неким идентификатором. Т.е. имееться возможность безболезненно менять программку "по частям". Правда есть и отрицательные аспекты - напр. версионность. с уважением (круглый) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
06.02.2006, 12:50
|
|||
|---|---|---|---|
|
|||
Класс из динамической Dll |
|||
|
#18+
kolobok0 1) у линковщика ищите нечто Linker->Input->Additional Dependencis и записываете тудысь нечто следующее... путя\xru.lib этот файл возьмите рядом с дэлеле Вашей хрю...оптимально -> нацелить прям путя к выходному каталогу дэлеле. Прошу прощения за мой французкий, но либо я действительно чего-то крепко не понимаю либо одно из двух. Ваш метод один в один похож на статическую привязку dll. Главный признак - использование *.lib файла. Динамическое привязывание *.dll использование этого файла не предполагает. Способ динамической привязки подробно изложен в экзампле: http://bdn.borland.com/article/0,1410,20165,00.html который любезно предоставил JibSkeart. Поправьте меня если я ошибаюсь. C Уважением, Евгений ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
06.02.2006, 12:57
|
|||
|---|---|---|---|
|
|||
Класс из динамической Dll |
|||
|
#18+
kolobok0 ...Механизация COMа хороша... Я абсолютно с Вами согласен. Но поскольку делаю первые шаги в области *.dll (раньше вполне обходился *.cpp библиотеками), то счел правильным вначале получше разобраться с этим вопросом, а потом, если увижу что требуемый функционал не достигнут, буду переводить код на COM или CORBA (еще не решил). С Уважением, Евгений. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
06.02.2006, 18:58
|
|||
|---|---|---|---|
Класс из динамической Dll |
|||
|
#18+
archez"Ваш метод один в один похож на статическую привязку dll. Главный признак - использование *.lib файла. Динамическое привязывание *.dll использование этого файла не предполагает." существуют такие понятие как 1) динамическая библиотека 2) статическая библиотека статика - поставляется в виде бинарного модуля с расширением LIB динамическая загружаемая библиотека - носит расширение DLL. При компиляции DLL образуется файл связи с расширением LIB. Он служит для упрятывания от Вас в толщу кода, загрузки и привязки вентелей вызовов Вашей DLL. существуют такие понятия как 1) явная загрузка DLL 2) не явная загрузка DLL явная - это когда Вы сами грузите ручками DLL. не явная - отдаёте на откуп механизации, - пример изложен мной выше. Приношу свои извинения, то что не глянул указанную ссылку ранее. Там описан способ явной загрузки DLL. Если Вам требуется грузить самому - то тут происходить загрузка библиотеки будет в момент явного обращения к апи LoadLibrary(...). Минусы такого метода - на момент загрузки могёт не оказаться исполняемого модуля, и в описании ручками всех используемых точек входа. Если Вам нужно загружать ручками библиотеку - то тогда рекомендую ышо быстрее ознакомиться с COM технологией (не путать с форточной OLE механизацией)... с уважением (круглый) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|

start [/forum/topic.php?fid=57&tablet=1&tid=2031996]: |
0ms |
get settings: |
10ms |
get forum list: |
19ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
222ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
49ms |
get tp. blocked users: |
1ms |
| others: | 258ms |
| total: | 580ms |

| 0 / 0 |
