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

C++

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

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

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

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

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

C++ Реализация
Пример плагина C++
Помощь в создание плагина C++ Builder
Реализация Visual C++
C++ реализация цикла for
C++ Разработка плагина для Winamp
Реализация telnet в c++ C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Fulcrum_013
657 / 725 / 72
Регистрация: 14.12.2014
Сообщений: 5,650
Завершенные тесты: 3
14.04.2016, 17:18     Реализация плагина #2
Цитата Сообщение от xTr1m Посмотреть сообщение
Может есть более изящные реализации?
COM
xTr1m
29 / 29 / 8
Регистрация: 06.03.2013
Сообщений: 151
14.04.2016, 17:23  [ТС]     Реализация плагина #3
Хм. Про него забыл конечно, спасибо. Но это как-то тяжеловато, не?
Fulcrum_013
657 / 725 / 72
Регистрация: 14.12.2014
Сообщений: 5,650
Завершенные тесты: 3
14.04.2016, 17:28     Реализация плагина #4
Цитата Сообщение от xTr1m Посмотреть сообщение
Но это как-то тяжеловато, не?
Ну можешь его вручную родить. Проще да?
Ну можешь на С++ Builder сделать, но тогда и DLL плагинов только на С++ Builder. Чтобы манглинг совпадал.
Croessmah
Модератор
Эксперт CЭксперт С++
12891 / 7277 / 811
Регистрация: 27.09.2012
Сообщений: 17,976
Записей в блоге: 2
Завершенные тесты: 1
15.04.2016, 22:00     Реализация плагина #5
Теория плагинов
Fulcrum_013
657 / 725 / 72
Регистрация: 14.12.2014
Сообщений: 5,650
Завершенные тесты: 3
15.04.2016, 22:14     Реализация плагина #6
Цитата Сообщение от xTr1m Посмотреть сообщение
Но это как-то тяжеловато, не?
Вообще есть еще один способ. работает примерно так. делаешь абстрактный класс. От него в каждом DLL порождаешь потомков. Из DLL импортируешь функцию создания объекта, которая возвращает указатель на созданного потомка. Пользуешь как обычный полиморфный объект. Пока невиртуальная часть кода базового класса идентична и в DLL и в exe, ну и если не ронять DLL пока есть живые созданные им объекты, то все ок. Но по большому счету такой способ не очень надежен. Хотя если DLL считает созданные объекты и у абстрактного класса нет полей данных и невиртуальных методов то не менее надежен чем COM. Правда такой байдой с прошлого тысячелетия не занимался.
xTr1m
29 / 29 / 8
Регистрация: 06.03.2013
Сообщений: 151
16.04.2016, 10:35  [ТС]     Реализация плагина #7
Fulcrum_013 , абстрактный класс в главном приложении? А как тогда в dll сделать класс, наследованный от чего-то неизвестного?
Fulcrum_013
657 / 725 / 72
Регистрация: 14.12.2014
Сообщений: 5,650
Завершенные тесты: 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 по своему.
xTr1m
29 / 29 / 8
Регистрация: 06.03.2013
Сообщений: 151
16.04.2016, 11:13  [ТС]     Реализация плагина #9
то есть мы делаем два одинаковых класса, чтобы с имитировать ситуацию, когда как-будто бы класс один и на dll, и на exe, так? а тут разве не будет разницы, например, с какими настройками компилятора собран exe, а с какими dll?
Fulcrum_013
657 / 725 / 72
Регистрация: 14.12.2014
Сообщений: 5,650
Завершенные тесты: 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 то никаких проблем быть не должно
xTr1m
29 / 29 / 8
Регистрация: 06.03.2013
Сообщений: 151
16.04.2016, 21:34  [ТС]     Реализация плагина #11
Что же, спасибо большое. Попробую именно так и сделать
Fulcrum_013
657 / 725 / 72
Регистрация: 14.12.2014
Сообщений: 5,650
Завершенные тесты: 3
16.04.2016, 22:08     Реализация плагина #12
Цитата Сообщение от xTr1m Посмотреть сообщение
Попробую именно так и сделать
Да еще, для удаления объекта заведи у него специальный метод который сам себя удаляет. Типа Release. Потому как если DLL и EXE будут собраны разными компиляторами то менеджеры памяти у них могут оказаться разными, соответственно delete из exe будет не совместим с new из dll
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.04.2016, 23:47     Реализация плагина
Еще ссылки по теме:

Visual C++ Зависает MSVS 2012 после установки Git плагина
C++ Builder написания плагина ProgDVB
Не получается скомпилировать F3DMaxExp Экспорт 3DS Max проект плагина C++ WinAPI
C++ WinAPI Исправить ошибки компиляции плагина для 3Ds Max!
Не выполняются действия плагина C++

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

Или воспользуйтесь поиском по форуму:
xTr1m
29 / 29 / 8
Регистрация: 06.03.2013
Сообщений: 151
16.04.2016, 23:47  [ТС]     Реализация плагина #13
Не знал. Спасибо
Yandex
Объявления
16.04.2016, 23:47     Реализация плагина
Ответ Создать тему
Опции темы

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