Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

вопрос про интерфейсы


MVanya ©   (2008-01-28 19:41:00) 

Я не про COM'овские интерфейсы говорю. Абстрактный вопрос наверное.
Видел в реализации "плагинного" движка такой прием, как: из приложения - плагину отдается один интерфейс, а плагин - отдает приложению другой.

Например - плагин (dll) - экспортируемая функция:
function CreatePLUGIN(PluginService: IPluginService): IPlugin; stdcall;
begin
 Result := TPlugin.Create(PluginService);
end;

exports
 CreatePLUGIN name 'CreatePLUGIN';


Сами интерфейсы:
этот отдают из dll в приложение
 IPlugin = interface
   function  GetPluginInfo: pPluginInfo; stdcall;
   procedure OnMessage(var PlugMsg: TPluginMessage); stdcall;
 end;

а этот отдает приложение плагину:
 IPluginService = interface
   function  PluginOptions(DllHandle: LongInt): pPluginSpecific; stdcall;
   procedure OnPluginMessage(var PlugMsg: TPluginMessage); stdcall;
 end;


А для реализации функционала плагина - делают в dll класс наследованный от TInterfacedObject и IPlugin, т.е.:

type
 TPlugin = class(TInterfacedObject, IPlugin)
 private
   FPluginSvc      : IPluginService;
   FPluginInfo     : TPluginInfo;
   ...
   constructor Create(const PluginService: IPluginService);
 end;

...
constructor TPlugin.Create(const PluginService: IPluginService);
begin
 FPluginSvc := PluginService;
end;
...


Зачем так делают? В чем преимущества применения интерфейсов в таком случае?

Спасибо.


Григорьев Антон   (2008-01-28 21:32:00) [1]

1. Легче получить указатель на одну функцию и, вызвав её, получить интерфейс, чем вызывать LoadLibrary для десятка-другого функций, каждый раз проверяя, что такая функция есть в библиотеке.

2. При компиляции плагина легче контролировать, что все требуемые функции реализованы и что их прототипы соответствуют требуемым.

3. Функции плагина можно разделить по группам, каждой назначить свой интерфейс, и тогда, в зависимости от того, какие из интерфейсов поддерживаются, определять, какую функциональность содержит конкретный плагин.


Наверх

Титульная страница Поиск, карта сайта Написать письмо