Шаблон плагина с .dll.Как я могу извлечь интерфейс плагина из DLL? - PullRequest
0 голосов
/ 29 июля 2010

У меня есть приложение, которое должно быть реализовано в виде шаблона плагина.
Плагины находятся в файлах dll, и я загружаю их на лету, в зависимости от параметра, заданного пользователем через командную строку. То есть, если пользователь хочет использовать plugin1, он вводит это имя в качестве параметра в командной строке при запуске приложения, и я должен загрузить его на лету.
Поскольку я использую шаблон плагинов, у меня есть интерфейс (поскольку он работает в c ++, это абстрактный класс), который реализуют все классы плагинов.
Моя дилемма, где поставить интерфейс класса? Для того, чтобы построить dll, я должен иметь объявление интерфейса в каждой dll.
Я хочу избежать необходимости менять интерфейс во всех библиотеках, когда есть необходимость в изменении интерфейса.
С другой стороны, если я объявлю интерфейсный класс в основном приложении, мои библиотеки не будут скомпилированы и собраны?
У вас есть предложение о том, как извлечь интерфейсный класс из библиотеки DLL и поместить его в основное приложение, поэтому, когда я захочу изменить его код, его не нужно будет менять в дюжине мест (то есть в каждой DLL ).

Заранее спасибо,

Приветствия

Ответы [ 4 ]

1 голос
/ 29 июля 2010

Если под "интерфейсом" вы говорите о файле заголовка, который описывает ваш базовый абстрактный класс, я не вижу реальной проблемы.

Вы можете поделиться и использовать файл (здесь, "файл заголовка")) среди нескольких проектов («проект» - это либо ваше основное приложение, либо один из ваших плагинов).В вашем случае это действительно имеет смысл.

1 голос
/ 29 июля 2010

Вам придется хранить определение интерфейса в общем месте (отдельный файл .h в подкаталоге say \ inc), и вам придется перекомпилировать все библиотеки после изменения интерфейса.В C ++ этого нет.Если вам нужна возможность уникальной идентификации интерфейсов, вы можете использовать что-то вроде COM и изменять идентификатор интерфейса каждый раз, когда вы ломаете интерфейс (опять же, вам придется перекомпилировать реализации, но с COM клиент не будет сталкиваться с неопределенным поведением из-за ада DLL).

0 голосов
/ 29 июля 2010

Я когда-то делал это в C #, но, возможно, это может вам помочь.Я создал интерфейс и абстрактный класс в отдельном проекте, на который ссылаются основное приложение и плагины.Таким образом, при необходимости есть только одно место для правок.

Main App.exe <-> PluginInterface.dll <-> APlugin.dll

Не уверен, как это сделать в C ++,Я думаю, вы могли бы создать отдельную dll для интерфейса плагина и загрузить ее из вашего exe и dll плагина.

Надеюсь, это поможет.

0 голосов
/ 29 июля 2010

Каждая DLL должна иметь одну и ту же экспортируемую функцию, которая возвращает указатель на ваш интерфейс. Каждая DLL должна отвечать за создание экземпляра «интерфейса» (на самом деле действительно подкласс). Таким образом, основное приложение появится, вызовет LoadLibrary для DLL, а затем с помощью GetProcAddress вызовет экспортированную функцию в DLL. Экспортируемая функция должна затем создать конкретный интерфейс и вернуть указатель на него.

Вопрос: «Где поставить интерфейс» Ответ: В вашей «общедоступной» папке API.

...