Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.09.2015, 15:53   #1
daniil_galahow
Пользователь
 
Регистрация: 04.03.2013
Сообщений: 13
Вопрос Как вызвать из DLL класс?

Доброго времени суток.

Есть потребность экспортировать из DLL не отдельные функции, а сразу целый класс.
Предполагал сделать это простым способом:
Код:
#ifdef IN_DLL
#define EXPORT __declspec(dllexport) 
#else
#define EXPORT __declspec(dllimport) 
#endif

class EXPORT MyClass
{
...
}
Коллеги говорят что это неправильно и пугают всякими неприличными словами вроде DLL Hell и так далее, а так же рекомендуют использовать COM+ для того чтобы "делать это правильно".

Почитал про COM+ и прослезился - неужели это всё надо делать чтобы экспортировать из DLL простой класс, который будет считать довольно тривиальную математику?
Есть ли какие-то другие способы кроме COM+ чтобы экспортировать из DLL класс?
daniil_galahow вне форума Ответить с цитированием
Старый 21.09.2015, 15:58   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
неужели это всё надо делать чтобы экспортировать из DLL простой класс
Да, только не класс а интерфейс класса. А так да. DLL сама по себе не позволит экспортировать целый класс.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 21.09.2015, 16:02   #3
Croessmah
Вредный кошак
Участник клуба
 
Аватар для Croessmah
 
Регистрация: 14.10.2012
Сообщений: 1,159
По умолчанию

Экспорт объектов класса сразу накладывает зависимость от транслятора, что неприменимо для COM.
Croessmah вне форума Ответить с цитированием
Старый 21.09.2015, 17:03   #4
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Цитата:
Сообщение от daniil_galahow Посмотреть сообщение
Коллеги говорят что это неправильно и пугают всякими неприличными словами вроде DLL Hell и так далее, а так же рекомендуют использовать COM+ для того чтобы "делать это правильно".
Вопрос однако почему вы решили экспортировать класс. В принципе можно послать коллег лесом, надо только не забывать при изменении класса менять его версию - CMyClass1, CMyClass2 и т.д.
Тогда никаких проблем с обратной совместимостью не будет.

Эскпорт класса все равно что эскпорт функции с аргументом в виде структуры.

Сама библиотека С++ экспротирует классы, и ничего, живет...
waleri вне форума Ответить с цитированием
Старый 21.09.2015, 17:16   #5
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

DLL Hell там будет в том что экспорт через __declspec(dllexport) гарантировано работет внутри одной версии компилятора, между разными компилями и разными версиями работа не гарантируется.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 21.09.2015, 17:19   #6
daniil_galahow
Пользователь
 
Регистрация: 04.03.2013
Сообщений: 13
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Вопрос однако почему вы решили экспортировать класс. В принципе можно послать коллег лесом, надо только не забывать при изменении класса менять его версию - CMyClass1, CMyClass2 и т.д.
Тогда никаких проблем с обратной совместимостью не будет.

Эскпорт класса все равно что эскпорт функции с аргументом в виде структуры.

Сама библиотека С++ экспротирует классы, и ничего, живет...
В алгоритм, реализованный внутри DLL, нужно передавать и забирать много информации (пачки многоканальных сигналов), а так же иметь возможность манипулировать ими извне. Постоянно вызывать из библиотеки только функцию расчёта получается неудобно и некрасиво, гораздо лучше иметь некий объект, внутри которого есть кэш где эти пачки сигналов лежат, который инициализируется один раз, и который прямо в себе хранит насчитанные результаты, отдавая их по требованию сторонних программ. Именно поэтому класс.

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
DLL Hell там будет в том что экспорт через __declspec(dllexport) гарантировано работет внутри одной версии компилятора, между разными компилями и разными версиями работа не гарантируется.
Спасибо. А в том случае если я делаю экспорт не класса напрямую, а экспортирую его интерфейс (как вот здесь) - проблема сохранится?

Последний раз редактировалось Stilet; 21.09.2015 в 17:42.
daniil_galahow вне форума Ответить с цитированием
Старый 21.09.2015, 17:26   #7
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

там же написано что нет.
там и есть тоже самое что делает COM.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 21.09.2015, 17:30   #8
Croessmah
Вредный кошак
Участник клуба
 
Аватар для Croessmah
 
Регистрация: 14.10.2012
Сообщений: 1,159
По умолчанию

Цитата:
а экспортирую его интерфейс (как вот здесь) - проблема сохранится?
Нет, но если будете экспортировать деструктор (виртуальный), то проблема сохранится.
Croessmah вне форума Ответить с цитированием
Старый 21.09.2015, 17:43   #9
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Именно поэтому класс.
А что мешает сделать СОМ сервер?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 21.09.2015, 17:49   #10
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
DLL Hell там будет в том что экспорт через __declspec(dllexport) гарантировано работет внутри одной версии компилятора, между разными компилями и разными версиями работа не гарантируется.
Вообще-то это как раз наименьшая из проблем - если библиотека и программа собраны разными компиляторами то чаще всего программа просто не запускается - имена методов не совпадают.

А вот если библиотека одной версии а программа другой версии, тогда могут происходить интересные вещи - имена методов одни и те же а вот количество данных в классе разное.
waleri вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Як вызвать функцию из dll в C# ? Dr.Pauliss Помощь студентам 5 26.09.2011 12:42
Массив в dll - как разместить массив в dll и как вызвать элемент этого массива по индексу? Кинельски Помощь студентам 0 23.05.2010 20:52
Как создать в Дeлфи класс в DLL для использования его в VC++ Dmitriy.Ch Общие вопросы Delphi 0 25.07.2009 08:40
как вызвать в Dll по указателю функцию, которая определена в главном потоке? SaintRain Общие вопросы Delphi 1 25.11.2006 08:27
как вызвать из Dll функцию, которая определена в главном потоке? SaintRain Win Api 1 23.11.2006 20:08