Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

C++

Войти
Регистрация
Восстановить пароль
 
xTr1m
29 / 29 / 8
Регистрация: 06.03.2013
Сообщений: 151
#1

Реализация плагина - C++

14.04.2016, 17:13. Просмотров 268. Ответов 12
Метки нет (Все метки)

Доброго времени суток. В общем есть приложения. В нём несколько классов со своим небольшим функционалом. Теперь мне надо реализовать возможность подключения плагинов. Вопрос в том, как правильно это делается? В голову пока приходит только такое. Завести в главном приложении некий класс (такой же как и остальные), в котором в реализации методов будут дергаться некие глобальные функции из подключаемой dll. Но как-то это через одно место.
Может есть более изящные реализации?

Добавлено через 2 часа 24 минуты
Давайте конкретизирую что ли. Какие вообще бывают варианты? Главное приложение ничего не знает о классах, которые могут быть в плагине. Как и плагин о dll. Можно наверное через макросы как синхронизировать названия, но что-то мне не нравится такой вариант. А, ну можно еще наверное через указатели на viod, а потом приводить опять же к заранее обговоренным классам или брать какие-то поля по адресу смещения. Но тоже крутовато)) Ну и вариант с глобальными функциями в dll, которые я буду дергать из приложения. Но эти функции тоже нужно как-то с классами связать
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.04.2016, 17:13
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Реализация плагина (C++):

IActiveDesktop реализация? - C++
Привет, всем кто это читает! Вообщем, нашел на одном форуме, парень спрашивал как ему сделать смену wallpaper на рабочем столе с...

Реализация событий в С++ - C++
Мне нужно реализовать события, как в Дельфи или С++ Builder, на Visual C++. Но стандартный С++ не поддерживает указатели на функции-члены...

написания плагина ProgDVB - C++ Builder
подскажите как написать плагин для ProgDVB который будет давать возможность удаленно управлять процессом записи каналов на нескольких...

Помощь в создание плагина - C++ Builder
Вопрос на засыпку. Хочу сделать плагин под аимп так как только так доступные все команды. Можно ли сделать так что бы один метод выполнял...

Реализация функции - C++ Builder
Подскажите,как зделать одну функцию,если у меня есть 5 однотипных блоков(осуществляющих поиск) такого типа void __fastcall...

Реализация QR генератора - C++ Builder
Добрый день! :senor: Очень нужна помощь O_o Кто нибудь реализовал генератор QR кодов в c++ builder? Поделитесь информацией или...

12
Fulcrum_013
Нарушитель
698 / 762 / 74
Регистрация: 14.12.2014
Сообщений: 6,034
Завершенные тесты: 3
14.04.2016, 17:18 #2
Цитата Сообщение от xTr1m Посмотреть сообщение
Может есть более изящные реализации?
COM
0
xTr1m
29 / 29 / 8
Регистрация: 06.03.2013
Сообщений: 151
14.04.2016, 17:23  [ТС] #3
Хм. Про него забыл конечно, спасибо. Но это как-то тяжеловато, не?
0
Fulcrum_013
Нарушитель
698 / 762 / 74
Регистрация: 14.12.2014
Сообщений: 6,034
Завершенные тесты: 3
14.04.2016, 17:28 #4
Цитата Сообщение от xTr1m Посмотреть сообщение
Но это как-то тяжеловато, не?
Ну можешь его вручную родить. Проще да?
Ну можешь на С++ Builder сделать, но тогда и DLL плагинов только на С++ Builder. Чтобы манглинг совпадал.
0
Croessmah
Эксперт CЭксперт С++
13513 / 7671 / 866
Регистрация: 27.09.2012
Сообщений: 18,884
Записей в блоге: 3
Завершенные тесты: 1
15.04.2016, 22:00 #5
Теория плагинов
0
Fulcrum_013
Нарушитель
698 / 762 / 74
Регистрация: 14.12.2014
Сообщений: 6,034
Завершенные тесты: 3
15.04.2016, 22:14 #6
Цитата Сообщение от xTr1m Посмотреть сообщение
Но это как-то тяжеловато, не?
Вообще есть еще один способ. работает примерно так. делаешь абстрактный класс. От него в каждом DLL порождаешь потомков. Из DLL импортируешь функцию создания объекта, которая возвращает указатель на созданного потомка. Пользуешь как обычный полиморфный объект. Пока невиртуальная часть кода базового класса идентична и в DLL и в exe, ну и если не ронять DLL пока есть живые созданные им объекты, то все ок. Но по большому счету такой способ не очень надежен. Хотя если DLL считает созданные объекты и у абстрактного класса нет полей данных и невиртуальных методов то не менее надежен чем COM. Правда такой байдой с прошлого тысячелетия не занимался.
1
xTr1m
29 / 29 / 8
Регистрация: 06.03.2013
Сообщений: 151
16.04.2016, 10:35  [ТС] #7
Fulcrum_013 , абстрактный класс в главном приложении? А как тогда в dll сделать класс, наследованный от чего-то неизвестного?
0
Fulcrum_013
Нарушитель
698 / 762 / 74
Регистрация: 14.12.2014
Сообщений: 6,034
Завершенные тесты: 3
16.04.2016, 10:52 #8
Цитата Сообщение от xTr1m Посмотреть сообщение
А как тогда в dll сделать класс, наследованный от чего-то неизвестного?
Хидеры и в DLL и в EXE одни и те же добавляешь. Если класс имеет что либо не обстрактное, то и код этого неабсстрактного и туда и туда прилинковываешь (хотя лучше все абстрактным оставить) . По большому счету получается почти COM только без GUID и возможности создания класса по GUID с автопоиском DLL которая его создаст. Так кстати DirectX умеет работать - импортируется одна функция которая создает класс-фабрику а он уже и все остальные, хотя и COM-интерфейс там тоже полноценный есть. COM кстати тоже так работает - для того чтобы COM-классами пользоваться тоже в EXE должен быть хидер описывающий интерфейс пользуемого объекта.

Добавлено через 5 минут
Цитата Сообщение от xTr1m Посмотреть сообщение
абстрактный класс в главном приложении?
Понимаешь суть абстрактного класса? Просто список мест в VMT. EXE больше знать и не надо. А в DLL от этого класса порождается наследник, который эту VMT заполняет (только это компилятор делает а не ручками если это на стороне EXE делать) реализациями методов. Только в каждом DLL по своему.
1
xTr1m
29 / 29 / 8
Регистрация: 06.03.2013
Сообщений: 151
16.04.2016, 11:13  [ТС] #9
то есть мы делаем два одинаковых класса, чтобы с имитировать ситуацию, когда как-будто бы класс один и на dll, и на exe, так? а тут разве не будет разницы, например, с какими настройками компилятора собран exe, а с какими dll?
0
Fulcrum_013
Нарушитель
698 / 762 / 74
Регистрация: 14.12.2014
Сообщений: 6,034
Завершенные тесты: 3
16.04.2016, 11:24 #10
Ну естественно все то же самое как при экспорте функций. Calling convention разрядность и т.д. должны совпадать для DLL и exe. т.е. у каждого класса уже в исходе есть своя табличка экспорта виртуальных функций - VMT, с экспортом только по номеру. Чем и пользуемся заполняя эту табличку в каждом DLL по разному. А для того чтобы оно все фунциклило формат таблички естественно одинаковый и в VMT и в DLL и в EXE. Оптимизировать индирект вызовы все равно не оптимизируешь, соответсвенно должны совпадать только calling convention и разрядность, даже совпадение набора инструкций не совсем обязательно. т.е EXE может быть собран к примеру с AVX-1 а DLL с AVX-2 и пока это работает на проце поддерживающем AVX-2 то никаких проблем быть не должно
1
xTr1m
29 / 29 / 8
Регистрация: 06.03.2013
Сообщений: 151
16.04.2016, 21:34  [ТС] #11
Что же, спасибо большое. Попробую именно так и сделать
0
Fulcrum_013
Нарушитель
698 / 762 / 74
Регистрация: 14.12.2014
Сообщений: 6,034
Завершенные тесты: 3
16.04.2016, 22:08 #12
Цитата Сообщение от xTr1m Посмотреть сообщение
Попробую именно так и сделать
Да еще, для удаления объекта заведи у него специальный метод который сам себя удаляет. Типа Release. Потому как если DLL и EXE будут собраны разными компиляторами то менеджеры памяти у них могут оказаться разными, соответственно delete из exe будет не совместим с new из dll
0
xTr1m
29 / 29 / 8
Регистрация: 06.03.2013
Сообщений: 151
16.04.2016, 23:47  [ТС] #13
Не знал. Спасибо
0
16.04.2016, 23:47
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.04.2016, 23:47
Привет! Вот еще темы с ответами:

Реализация формулы - C++ Builder
Всех вновь приветствую, решил обратиться за следующей помощью. Дана формула: (Form1) Необходимо реализовать данную в С++. Мне как-то...

Реализация косинуса - C++ Builder
Доброго времени суток. Поставлена следующая задача: Разработайте приложение «калькулятор», которое бы позволяло вычислять значе-ния...

Реализация StrSmartCase - C++ Builder
здраствуйте, кто-нибудь чего-нибудь знает про StrSmartCase меня интересует параметр чтоб каждое слово в строке начиналось с большой...

Реализация отключение обработчиков плагина - jQuery
Здравствуйте. Написал свой первый jQuery-плагин lightBox для открытия картинок в модальном окне. Хочется уже сделать на совесть и...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru