29 / 58 / 6
Регистрация: 10.01.2011
Сообщений: 1,231
1

Экспорт классов из dll библиотек (Visual Studio)

29.09.2014, 18:42. Показов 5303. Ответов 17
Метки нет (Все метки)

Здравствуйте! Подскажите, как такой код вставить в dll файл и загрузить его в программу:
C++
1
2
3
4
5
6
7
8
9
10
11
12
//log.h
#include <iostream>
class Log
{
  public:
  void write();
};
//log.cpp
void Log::write()
{
  std::cout << "12345";
}
И еще вопрос, целесообразно делать программу из 20 подключаемых dll или классы лучше в одном и том же проекте держать?
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.09.2014, 18:42
Ответы с готовыми решениями:

Экспорт классов из DLL
Привет. Вот так я экспортирую обычные ф-ии: main.h #ifndef __MAIN_H__ #define __MAIN_H__ ...

Подключение библиотек в Visual Studio
Хочу подключить библиотеки DirectX (да и не только) к среде Visual Studio 2017, но не через...

Добавление библиотек в Visual Studio. Откуда взять нужные библиотеки?
Скачал проект, но Visual не может найти библиотеки, используемые в этом проекте. Есть ли...

Конструктор классов, Visual Studio 2008
Добрый день)) Помогите разобраться с ошибками. В участке кода //Перегрузка конструктора...

17
Заблокирован
29.09.2014, 19:44 2
Лучший ответ Сообщение было отмечено Helldrg как решение

Решение

Цитата Сообщение от Helldrg Посмотреть сообщение
И еще вопрос, целесообразно делать программу из 20 подключаемых dll или классы лучше в одном и том же проекте держать?
Исходя из того, что тебе нужна DLL, Ты программируешь под Windows и как следствие, наверное, в VisualStudio.
В VisualStudio ты создаёшь Solution, в котором может быть сколько угодно проектов, по этому мой тебе совет, делай софт модульным (и как можно модульней), все логические модули выноси в отдельный DLL. В одном логическом модуле может быть далеко не один класс, главное чтоб они представляли из себя одну логическую единицу. В программе может быть сколько угодно DLL-к. Какие в этом плюсы?
1. Модульность
2. Простота автообновления софта
3. Грамотная архитектура

Цитата Сообщение от Helldrg Посмотреть сообщение
Подскажите, как такой код вставить в dll файл и загрузить его в программу:
А что его вставлять - то? В студии же есть тип проекта - "DLL".
Ну вот, сотри, накидал для тебя тестовый солюшен.
В нём идёт экспорт класса, но для этого тебе нужен хедер dll-ки (в лоюшене всё настроено).
Можно импортировать отдельные функции и без эедера, просто по названию. Так же под винду в студии есть директива #import для статического импорта DLL.

В общем смотри солюшен в архиве
Вложения
Тип файла: rar Log.rar (9.5 Кб, 98 просмотров)
1
29 / 58 / 6
Регистрация: 10.01.2011
Сообщений: 1,231
29.09.2014, 21:17  [ТС] 3
Спасибо!
Цитата Сообщение от Scrooge McDuck Посмотреть сообщение
Можно импортировать отдельные функции и без эедера, просто по названию. Так же под винду в студии есть директива #import для статического импорта DLL.
Можно чуть поподробней описать на данном примере?
0
Заблокирован
29.09.2014, 21:32 4
Цитата Сообщение от Helldrg Посмотреть сообщение
Можно чуть поподробней описать на данном примере?
Ну смотри, импортировать класс без его описания (которое обычно в хэдэр файлах) нельзя, т.к. функция GetProcAddress получает всего навсего адрес функции, а точнее просто адрес. То есть, если ты не предполагаешь, что по этому адресу должно находится, то этот адрес становится абсолютно бесполезен.
Это равносильно тому, что ты получаешь указатель void* и если ты знаешь, что должно там находиться, ты его приводишь к указателю определённого типа.
Ну это я к чему, просто даже не знаю как тебе объяснить. Ты можешь и не иметь хэдэр файла с описанием класса твоей длл-ки и если ты точно знаешь, что там за класс и сможешь его вручную описать, то можешь и использовать, но как ты сам понимаешь - это бред, да и обычно, если dll-ка не твоя, то и описания классов нет, если эта dll-ка не из какого - то набора SDK.
Вот теперь про функцию. Как я говорил, её можно импортировать без хэдэр файла, НО! только по тому, что опять же ты знаешь, что это за функция, точнее что она должна возвращать и какой у неё набор аргументов, вот если смотреть на мой пример, то тут как раз есть одна функция, которая импортируется без хэдэр файла:
C++
1
2
3
4
5
EXTERN_C LOG_API  Log* GetPointer();
Log* GetPointer()
{
    return new Log;
}
Я её импортирую чисто по названию, но опять же, только по тому, что я сам эту функцию писал и знаю, как она описывается:
C++
1
typedef Log* (*GET_POINTER)();
И опять же именно в данном случае хэдэр всё же понадобится, т.к. она возвращает указатель на твой класс.
Ну как бы если б у тебя была бы твоя функция из первого поста вне класса, глобальной если б была, её я мог бы импортировать вообще без всего.
Небольшие ремарки:
1. Деструктор в импортируемом классе должен быть обязательно виртуальным.
2. Все функции в импортируемом классе, которые ты собираешься использовать вне DLL, тоже должны быть виртуальными.

Ты лучше спрашивай, что конкретно тебе не ясно
1
29 / 58 / 6
Регистрация: 10.01.2011
Сообщений: 1,231
29.09.2014, 23:35  [ТС] 5
Спасибо, вроде все ясно!
0
Ушел с форума
Эксперт С++
16449 / 7413 / 1186
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
30.09.2014, 00:29 6
Цитата Сообщение от Helldrg Посмотреть сообщение
целесообразно делать программу из 20 подключаемых dll или классы лучше в одном и том же проекте держать?
Целесообразность определяется требованиями, а также удобством поддержки.

Сама по себе идея разбить систему на модули и раскидать их по dll - хорошая.
Такой подход может ускорять пересборку проекта, обновление одних версий dll
другими, упрощать процесс тестирования...

Но 20 классов в 20 dll - это перебор, тут даже комментарии не нужны.
Замучаетесь с ними, когда нужно будет просто переименовать или удалить
какой-нибудь класс. И чем больше в проекте будет компонентов, чем больше
будет разных зависимостей (порядок сборки dll, сценарии установки программы,
общие папки для заголовков и библиотек импорта и т.д.), тем ужаснее станет
поддержка всего этого "хозяйства".

Далее, экспорт классов налагает на них определенные требования.
Например, необходимость использования единого аллокатора памяти или общей
схемы создания и разрушения объектов. Не все так просто экспортировать
(например, попробуйте эксперимента ради экспортировать класс с std::string
или std::vector). Поменяете один символ из набора экспортов - dll станет
несовместимой с предыдущими версиями. Некоторые виды оптимизации, например,
встраивание функций по месту вызова, станут недоступными, если классы и
функции разнести по разным dll. Думаю, это далеко не полный список.
1
29 / 58 / 6
Регистрация: 10.01.2011
Сообщений: 1,231
30.09.2014, 01:04  [ТС] 7
Вот не компилируется проект, подскажите в чем дело
Вложения
Тип файла: rar log.rar (207.8 Кб, 21 просмотров)
0
5488 / 4883 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
30.09.2014, 01:38 8
Цитата Сообщение от Helldrg Посмотреть сообщение
Вот не компилируется проект, подскажите в чем дело
dll собираете? Если да, то укажите в свойствах проекта, у вас exe стоит.
1
29 / 58 / 6
Регистрация: 10.01.2011
Сообщений: 1,231
30.09.2014, 02:16  [ТС] 9
Спасибо большое, все работает!!! Может советы еще какие-нибудь дадите по использованию dll и lib?
0
Заблокирован
30.09.2014, 08:50 10
Цитата Сообщение от Убежденный Посмотреть сообщение
И чем больше в проекте будет компонентов, чем больше
будет разных зависимостей (порядок сборки dll
Если библиотеки подключать чисто динамический (GetProcAdress), то даже в случае экспорта класса, порядок сборки особо не влияет, если конечно обновлять в дллках реализацию, а не описание
1
29 / 58 / 6
Регистрация: 10.01.2011
Сообщений: 1,231
30.09.2014, 14:54  [ТС] 11
Вот появились еще вопросы, что лучше использовать dll или lib библиотеки, и есть ли способ совсем простое подключение сделать к проекту, например, написать #include <log.dll> или #pragma comment(lib,"log.lib")
что бы сразу можно было объекты создавать Log* L = new Log;
То есть облегчить подключение конечному разработчику =)
0
5488 / 4883 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
30.09.2014, 15:46 12
Цитата Сообщение от Helldrg Посмотреть сообщение
и есть ли способ совсем простое подключение сделать к проекту,
Для lib есть.
1
29 / 58 / 6
Регистрация: 10.01.2011
Сообщений: 1,231
30.09.2014, 18:33  [ТС] 13
А можно мой пример с lib показать как делается и что лучше использовать dll или lib библиотеки?
0
5488 / 4883 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
30.09.2014, 18:55 14
Показывать особо нечего. Собираете реализацию класса как lib. Помещаете её в папку проекта. Компоновщику указываете эту либу (Компоновщик - Ввод - Дополнительныые зависимости, или можно через #pragma comment(lib,"*.lib")). Там где используется класс, подключается хедер класса.
1
29 / 58 / 6
Регистрация: 10.01.2011
Сообщений: 1,231
30.09.2014, 20:24  [ТС] 15
Действительно, все очень просто! А не подскажете, что лучше использовать dll или lib и возникает вопрос, если я скомпилировал библиотеку, программу, а через некоторое время понадобилось обновить библиотеку, я смогу по идее обновить только реализацию класса, а чтоб описание его поменять получается надо саму программу перекомпилировать?
0
138 / 23 / 3
Регистрация: 06.05.2019
Сообщений: 1,533
Записей в блоге: 4
30.05.2021, 02:17 16
Ну так выложите код как экспортировать класс из dll для динамических библиотек и статических.
0
49 / 147 / 33
Регистрация: 29.06.2019
Сообщений: 1,428
30.05.2021, 09:13 17
Цитата Сообщение от Helldrg Посмотреть сообщение
и есть ли способ совсем простое подключение сделать к проекту, например, написать #include <log.dll>
такие библиотеки (которые просто #include) даже в .lib (статич. библ) засовывать НЕ надо, можно просто в .h оформить...
до сих пор не вижу преимуществ в формировании .lib и .dll - если бы знала, зачем мне это - может и написала бы... вот зачем? - вот вопрос! кто знает? кто кодил .lib и/или .dll?..
p.s.
последние (.dll), мне кажется, только для подключения к др. яз, в составе COM, - полезны...
p.p.s.
ведь проще .h набросать для проекта - скомпилить и жить спокойно

Добавлено через 1 минуту
.lib не делала сам - не знаю, куда использовать и когда стоит сделать .lib
0
138 / 23 / 3
Регистрация: 06.05.2019
Сообщений: 1,533
Записей в блоге: 4
30.05.2021, 21:54 18
Цитата Сообщение от JeyCi Посмотреть сообщение
последние (.dll), мне кажется, только для подключения к др. яз, в составе COM, - полезны...
Получается что так.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.05.2021, 21:54
Помогаю со студенческими работами здесь

Подключение dll к проекту на Visual Studio
Привет. Я в этом деле новичок еще не приходилось собирать с нуля проекты с .dll в visual studio...

Открыть dll из Borland в Visual Studio
Доброго времени суток! Я сталкнулась с одной проблемой. Помогите пожалуйста разобраться. У меня...

Подключение dll к проекту в visual studio
Доброго дня, тема уже эта конечно избитая на форуме, но так и не смог найти решения под свою...

Visual Studio не видит dll файл
Для лабораторной было задано написать программу. Был найден пример в интернете, найдена для него...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru