Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.02.24;
Скачать: CL | DM;

Вниз

вопрос про интерфейсы   Найти похожие ветки 

 
MVanya   (2008-01-28 19:41) [0]

Я не про 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) [1]

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

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

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



Страницы: 1 вся ветка

Текущий архив: 2008.02.24;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.018 c
2-1201708579
mrArmstrong
2008-01-30 18:56
2008.02.24
Поиск по текстам


2-1201537907
oleg_teacher
2008-01-28 19:31
2008.02.24
out of memory


2-1201813420
flaxe
2008-02-01 00:03
2008.02.24
Динамическое создание объектов


15-1201059535
Slider007
2008-01-23 06:38
2008.02.24
С днем рождения ! 23 января 2008 среда


2-1201538438
ComboBox
2008-01-28 19:40
2008.02.24
Шрифт в ComboBox