Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > Механизм плагинов (dll)


Автор: sn8p 18.9.2007, 10:50
Здравстуйте, уважаемые.
Пишу программу (MFC), которая должна использовать плагины dll (не обязательно MFC!). В плагинах будет часто повторяться одинаковый функционал, поэтому хотелось бы вынести набор функций отдельно (реализовать в главной программе). Собственно вопрос заключается в следущем: какими методами лучше предоставлять dll-ке функции, реализованые в клиенте? Например плагины могут сохранять какие-то данные, но хотелось бы это сделать централизовано, а не чтоб каждый по своему писал в свой отдельный файл. И таких функций будет не мало, поэтому просто их перечислять в параметрах функций dll тоже не хотелось бы.
Зарание спасибо.

Автор: SenkraD 18.9.2007, 11:57
sn8p, может http://www.cyberguru.ru/programming/visual-cpp/application-with-plugins.html поможет

Автор: sn8p 18.9.2007, 13:05
Цитата(SenkraD @  18.9.2007,  11:57 Найти цитируемый пост)
sn8p, может это поможет

SenkraD, спасибо. Статья полезная, но не раскрывает моего вопроса.

Из предложеных мне вариантов пока 2:
1) написать dll с необходимым функционалом, которую будут подключать все плагины и главная программа
2) передавать адреса функций (реализованых в главной программе) как параметры в функции, экспортируемые dll

первый способ вроде подходит. второй не подойдет при большом количестве функций.
какие еще могут быть варианты?

Автор: Earnest 19.9.2007, 15:18
Интерфейсы, конечно. И не обязательно именно IDL\ATL. Если не планируешь писать плагины на Бейсике, можно ограничиться "наколенной" реализацией.
Т.е.:
- определяешь несколько интерфейсов, в одном или нескольких заголовочных файлов.
- реализуешь их в главной модуле
- передаешь плагинам при подключении либо таблицу интерфейсов, либо конкретные интерфейсы, либо реализуешь в главном модуле какую-нибудь функцию типа GiveMeInterface ("ABCD").
Под интерфесом здесь понимается набор логически связанных функций, например:
Код

struct IDataFile: [virtual] public IBaseIFace
{
   virtual bool OpenFile (LPCTSTR) = 0;
   virtual bool SaveFile (LPCTSTR) = 0;
   ...
};

Базовый интерфейс удобен, чтобы хранить интерфесы в таблице или возвращать единственной функцией. В реализации объеви просто статические объекты и возвращай их адреса, чтобы не зморачиваться с удалением и подсчетом ссылок - в этой задаче сие не нужно.
Таким образом можно победить любое число функций. 

Автор: NiJazz 24.9.2007, 08:30
COM здесь весьма кстати. Один минус - нужно регистрировать компонент в реестре по всем формальным правилам.

Автор: sn8p 2.10.2007, 09:51
Earnest, спасибо! ктруто!
NiJazz,  хотелось бы без COM, чтоб максимально упростить разработку плагинов.

Автор: SenkraD 2.10.2007, 10:31
Earnest,  лови + от sn8p, думаю он хотел бы тебе его дать

Автор: sn8p 2.10.2007, 17:34
SenkraD, в точку!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)